精华内容
下载资源
问答
  • 视频转gif软件(抠抠视频秀) 轻轻松松,将您喜爱的在线视频抓取转化成GIF动画文件。完美支持优酷、酷6、土豆、YOUTUBE等等在线...★以下GIF动画文件,都是使用最新的2.1.0字幕版本生成的 GIF 动画,怎么样?很酷吧!
  • 很纠结啊 这几天 在研究怎么从网络上加载gif图片,看了很多例子,感觉大多数功能都不够完成 ,所以我自己 整理了一下,结合了网络加载和本地加载,以及不是gif的图片,这样估计功能强大一些。  但是现在纠结的是 ...

      很纠结啊 这几天 在研究怎么从网络上加载gif图片,看了很多例子,感觉大多数功能都不够完成 ,所以我自己 整理了一下,结合了网络加载和本地加载,以及不是gif的图片,这样估计功能强大一些。

     但是现在纠结的是 我是结合两个人的东西 自己后加的并不算多,不知道 这个是属于原创呢?还是转载呢?纠结了很长时间,还是写成原创了,如果不可以,在改回来,参考的那两个地址,一个是:http://blog.csdn.net/guolin_blog/article/details/11100315,这个是本地加载的另一个是:http://blog.csdn.net/a764424767/article/details/17915177,这个是网络加载的。 我添加的功能是 自定义了一个 <attr name="gif_url" format="string"></attr>属性,可以直接在xml文件了设置网络地址,再次就是将两个代码整合了一下 ,改动了一些地方。


    下面不说了直接上代码:


    package com.lgwteam.security_ui;


    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.lang.reflect.Field;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;


    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Movie;
    import android.os.Handler;
    import android.os.Message;
    import android.os.SystemClock;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.util.TypedValue;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.ImageView;


    import com.example.myproject_test1.R;


    public class GifView extends ImageView implements OnClickListener {


    private static final int LOADACOMPLISH = 1;
    /**
    * 获取线程池
    */
    private static ExecutorService pools = Executors.newCachedThreadPool();
    /**
    * 播放GIF动画的关键类
    */
    private Movie gifMovie;


    /**
    * 开始播放按钮图片
    */
    private Bitmap gifStartButton;


    /**
    * 记录动画开始的时间
    */
    private long gifMovieStart;


    /**
    * GIF图片的宽度
    */
    private int gifImageWidth;


    /**
    * GIF图片的高度
    */
    private int gifImageHeight;


    /**
    * 图片是否正在播放
    */
    private boolean isPlaying;


    /**
    * 是否允许自动播放
    */
    private boolean isAutoPlay;


    /**
    * 加载完毕,通知重绘控件
    */
    private final Handler handler = new Handler(this.getContext()
    .getMainLooper()) {
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case LOADACOMPLISH:
    if (msg.obj == null) {
    return;
    }
    Log.e("look", "加载完毕!!!");
    setResource((byte[]) msg.obj);
    break;


    default:
    break;
    }
    }
    };


    /**
    * GifView构造函数。

    * @param context
    */
    public GifView(Context context) {
    super(context);
    }


    /**
    * GifView构造函数。

    * @param context
    */
    public GifView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
    }


    /**
    * GifView构造函数,在这里完成所有必要的初始化操作。

    * @param context
    */
    public GifView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    TypedArray a = context.obtainStyledAttributes(attrs,
    R.styleable.GifView);
    int resourceId = getResourceId(a, context, attrs);
    isAutoPlay = a.getBoolean(R.styleable.GifView_auto_play, false);
    String urlstr = a.getString(R.styleable.GifView_gif_url);
    if (urlstr != null) {
    Log.i("urlstr", urlstr);
    setResource(urlstr);
    }
    if (resourceId != 0) {
    // 当资源id不等于0时,就去获取该资源的流
    InputStream is = getResources().openRawResource(resourceId);
    // 使用Movie类对流进行解码
    gifMovie = Movie.decodeStream(is);
    if (gifMovie != null) {
    // 如果返回值不等于null,就说明这是一个GIF图片,下面获取是否自动播放的属性


    Bitmap bitmap = BitmapFactory.decodeStream(is);
    gifImageWidth = bitmap.getWidth();
    gifImageHeight = bitmap.getHeight();
    bitmap.recycle();
    if (!isAutoPlay) {
    // 当不允许自动播放的时候,得到开始播放按钮的图片,并注册点击事件
    gifStartButton = BitmapFactory.decodeResource(
    getResources(), R.drawable.start_play);
    setOnClickListener(this);
    }
    }
    }


    }


    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    if (v.getId() == getId()) {
    // 当用户点击图片时,开始播放GIF动画
    isPlaying = true;
    invalidate();
    }
    }


    /**
    * 通过Java反射,获取到src指定图片资源所对应的id。

    * @param typeArray
    * @param context
    * @param attrs
    * @return 返回布局文件中指定图片资源所对应的id,没有指定任何图片资源就返回0。
    */
    private int getResourceId(TypedArray typeArray, Context context,
    AttributeSet attrs) {
    try {
    Field field = TypedArray.class.getDeclaredField("mValue");
    field.setAccessible(true);
    TypedValue typedValueObject = (TypedValue) field.get(typeArray);
    return typedValueObject.resourceId;
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    if (typeArray != null) {
    typeArray.recycle();
    }
    }
    return 0;
    }


    /**
    * 获取网络资源

    * @param urlstr
    */
    public void setResource(final String urlstr) {
    pools.execute(new Runnable() {
    public void run() {
    try {
    URL url = new URL(urlstr);
    HttpURLConnection connection = (HttpURLConnection) url
    .openConnection();
    connection.setConnectTimeout(10000);
    connection.setReadTimeout(10000);
    connection.setRequestMethod("GET");
    if (connection.getResponseCode() == 200) {
    InputStream is = connection.getInputStream();


    byte[] buffer = getByte(is);
    handler.obtainMessage(1, buffer).sendToTarget();
    } else {
    Log.e("getResponseCode", connection.getResponseCode()
    + ":");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    }


    /**
    * 读取InputStream里面的内容

    * @param inputStream
    * @return byte[]
    */
    private final static byte[] getByte(InputStream inputStream) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    int len = 0;
    byte[] buffer = new byte[1024];
    try {
    while ((len = inputStream.read(buffer)) > 0) {
    outputStream.write(buffer, 0, len);
    }
    return outputStream.toByteArray();
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }


    @Override
    protected void onDraw(Canvas canvas) {
    Log.i("onDraw", "onDraw");
    if (gifMovie == null) {
    // mMovie等于null,说明是张普通的图片,则直接调用父类的onDraw()方法
    super.onDraw(canvas);
    } else {
    // mMovie不等于null,说明是张GIF图片
    if (isAutoPlay) {
    // 如果允许自动播放,就调用playMovie()方法播放GIF动画
    playMovie(canvas);
    invalidate();
    } else {
    // 不允许自动播放时,判断当前图片是否正在播放
    if (isPlaying) {
    // 正在播放就继续调用playMovie()方法,一直到动画播放结束为止
    if (playMovie(canvas)) {
    isPlaying = false;
    }
    invalidate();
    } else {
    // 还没开始播放就只绘制GIF图片的第一帧,并绘制一个开始按钮
    gifMovie.setTime(0);
    gifMovie.draw(canvas, 0, 0);
    int offsetW = (gifImageWidth - gifStartButton.getWidth()) / 2;
    int offsetH = (gifImageHeight - gifStartButton.getHeight()) / 2;
    canvas.drawBitmap(gifStartButton, offsetW, offsetH, null);
    }
    }
    }
    }


    /**
    * 开始播放GIF动画,播放完成返回true,未完成返回false。

    * @param canvas
    * @return 播放完成返回true,未完成返回false。
    */
    private boolean playMovie(Canvas canvas) {
    long now = SystemClock.uptimeMillis();
    if (gifMovieStart == 0) {
    gifMovieStart = now;
    }
    int duration = gifMovie.duration();
    if (duration == 0) {
    duration = 1000;
    }
    int relTime = (int) ((now - gifMovieStart) % duration);
    gifMovie.setTime(relTime);
    gifMovie.draw(canvas, 0, 0);
    if ((now - gifMovieStart) >= duration) {
    gifMovieStart = 0;
    return true;
    }
    return false;
    }


    /**
    * 获取gif动态图

    * @param data
    */
    public void setResource(byte[] data) {
    gifMovie = Movie.decodeByteArray(data, 0, data.length);
    Log.i("setResource", "setResource");
    gifImageHeight = gifMovie.height();
    gifImageWidth = gifMovie.width();
    reMeasure();
    invalidate();
    }


    /**
    * 重新测量长度
    */
    private final void reMeasure() {
    if (gifMovie != null) {
    Log.i("reMeasure", "reMeasure");
    measure(MeasureSpec.makeMeasureSpec(gifMovie.width(),
    MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
    gifMovie.height(), MeasureSpec.EXACTLY));
    }
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    if (gifMovie != null) {
    Log.i("gifMovie", "gifMovie");
    LayoutParams lp = (LayoutParams) getLayoutParams();
    boolean isWidMat = lp.width == LayoutParams.MATCH_PARENT;
    boolean isHeiMat = lp.height == LayoutParams.MATCH_PARENT;
    boolean isWidWra = lp.width == LayoutParams.WRAP_CONTENT;
    boolean isHeiWra = lp.height == LayoutParams.WRAP_CONTENT;
    if (isWidMat && isHeiMat) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    return;
    }


    if (gifMovie != null) {
    requestLayout();
    setMeasuredDimension(
    isWidMat ? MeasureSpec.getSize(widthMeasureSpec)
    : isWidWra ? gifImageWidth : lp.width,
    isHeiMat ? MeasureSpec.getSize(heightMeasureSpec)
    : isHeiWra ? gifImageHeight : lp.height);
    }
    }
    }
    }



    xml文件:

     <com.lgwteam.security_ui.GifView
                android:id="@+id/gfGif"
                android:layout_width="wrap_content"
                android:layout_gravity="center"
                android:layout_height="wrap_content"
                android:src="@drawable/loading"
                android:scaleType="fitCenter"
                app:gif_url="@string/web_address"
                app:auto_play="true" />


    展开全文
  • 今天闲来无事,调试一个单页面VUE的效果,94年的开发小哥哥说,让我给他个菊花...Excuse me? 菊花这样么? 还是?这样?简直让我脑洞大开。。 其实呐,他说的是这个。。等待状态,我内心    好了...

    缘起:

    今天闲来无事,调试一个单页面VUE的效果,94年的开发小哥哥说,让我给他加个菊花图...Excuse me? 菊花图?长这样么?

    还是?长这样?简直让我脑洞大开。。

    其实呐,他说的是这个。。等待状态,我内心 

     

    好了,那怎么实现呐

     

     

    第一反应:gif

    找个gif 图好麻烦~

    想了想、、一定有别的解决方式。

     

     

    第二反应:看别的怎么做

    第一个想起来宠幸的就是Antd,毕竟是我用的最多的库~

    来我们去看看antd的loading怎么做的,点进去发现,它不叫loading~叫Spin~

     

    来~看看怎么实现的吧~

    超简单~ 只需要 HTML + CSS

      <span class="ant-spin-dot ant-spin-dot-spin">
        <i></i><i></i><i></i><i></i>
      </span>
    .ant-spin-dot {
      position: relative;
      display: inline-block;
      font-size: 20px;
      width: 20px;
      height: 20px;
    }
    .ant-spin-dot-spin{
      transform: rotate(45deg);
      animation: antRotate 1.2s infinite linear;
    }
    
    .ant-spin-dot i {
      width: 9px;
      height: 9px;
      border-radius: 100%;
      background-color: #1890ff;
      transform: scale(0.75);
      display: block;
      position: absolute;
      opacity: 0.3;
      animation: antSpinMove 1s infinite linear alternate;
      transform-origin: 50% 50%;
      &:nth-child(1) {
        left: 0;
        top: 0;
      }
      &:nth-child(2) {
        right: 0;
        top: 0;
        animation-delay: 0.4s;
      }
      &:nth-child(3) {
        right: 0;
        bottom: 0;
        animation-delay: 0.8s;
      }
      &:nth-child(4) {
        left: 0;
        bottom: 0;
        animation-delay: 1.2s;
      }
    }
    @keyframes antSpinMove {
      to {
        opacity: 1;
      }
    }
    @keyframes antRotate {
      to {
        transform: rotate(405deg);
      }
    }

     

     

     

     

    惯例DEMO:CodePen 传送门

     

     

    资料库:

    1、Antd Spin 传送门

    展开全文
  • 清晰预览超大图和长图 拼一张功能(可配置开关,可独立作为拼图使用) 原图功能(可配置开关) 广告填充(可配置开关) 过滤图片(图片宽度、图片高度、文件大小三个维度任意选择和搭配) 默认勾选图片(可配置) ...
  • AspJpeg 2.4.0.1

    2012-06-20 15:08:42
    ASP组件AspJpeg(水印)使用方法大全ASPJPEG是Persits出品的共享软件,它是一款功能相当强大的asp图象处理组件,用它可以轻松地做出图片的缩略和为图片加上水印功能。 水印组件AspJpeg2.4.0.1 下面简单介绍一下...
  • 立几画板 v6.0.5.2.zip

    2019-07-10 07:41:56
    可以运用多种投影(正平行投影、斜平行投影、中心投影)方式显示,可以多视图显示(主视图、左视、顶视图等),可以把被遮挡的线自动显示为虚线,可以对每一个物件添加材质属性,可灯光效果、彩色贴图,自然...
  • Excel插件--OBS.DLL

    2008-11-27 17:05:52
    上网时间了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办...
  • 突然有个人我的qq,一看竟然是十年前被我删掉的初恋。。。。 因为之前在qq空间有太多的互动,所以qq推荐好友里面经常推荐我俩互相认识。。。。谜之尴尬 同意好友申请以后,仔细看了她这十年间...
  • 2、给内容页的“上一篇”、“下一篇”做了自适应处理,不管标题再怎么长,都会以省略号代替溢出文字。 3、修正了侧边栏“个人资料”头像宽高不均导致撑破边框问题。 4、修正首页、内容页底部“站长”在“微语页”不...
  • Excel终极伴侣1.291

    2009-03-19 09:01:10
    上网时间了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办...
  • Excel终极伴侣1.290

    2009-03-12 14:33:14
    上网时间了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办...
  • Excel终极伴侣1.288

    2008-11-26 16:01:36
    上网时间了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办...
  • Excel终极伴侣1.287

    2008-10-24 16:41:04
    上网时间了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办...
  • Excel终极伴侣1.286

    2008-10-14 10:56:40
    上网时间了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办...
  • golang面试题:json包变量不tag会怎么样? 零切片、空切片、nil切片是什么 slice深拷贝和浅拷贝 map触发扩容的时机,满足什么条件时扩容? map扩容策略是什么 自定义类型切片转字节切片和字节切片转回自动以类型...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64解密、哈希解密以及其它的文件解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    服务器可以将收集到的信息以柱状和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 ...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64解密、哈希解密以及其它的文件解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64解密、哈希解密以及其它的文件解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64解密、哈希解密以及其它的文件解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64解密、哈希解密以及其它的文件解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64解密、哈希解密以及其它的文件解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
  • GIF:CompuServe位图文件 GL:动画格式 GRP:程序管理组 H HEX:Macintosh BinHex2.0文件 HLP:帮助文件;Date CAD Windows帮助文件 HPP:C++程序头文件 HQX:Macintosh BinHex 4.0文件 HT:HyperTerminal...
  • 性能监控一般都会通过中的代码来监控与捕获任务,可以看到这个entryType是longtask的。 <p><img alt="图片" src="https://img-blog.csdnimg.cn/img_convert/048be5f3502b155cbdc2887967d6d603.png" /></p>...
  • 6.如下,在mydlg.ui 中拖入一个Push Button,将其上的文本改为“进入主 窗口”,在其属性窗口中将其objectName 改为enterBtn,在下面的Signals and slots editor 中进行信号和槽的关联,其中,Sender 设为enterBtn...
  • o 6.6 如果 NULL 定义成 #define NULL ((char *)0) 难道不就可以向函数传入不转换的 NULL 了吗? o 6.7 如果 NULL 和 0 作为空指针常数是等价的, 那我到底该用哪一个呢? o 6.8 但是如果 NULL 的值改变了, 比如...
  • 此文篇幅较,建议保存(star)再看。传送门: <a href="https://github.com/Nealyang/PersonalBlog/issues/11">Nealyang personal blog</a></strong> 前言 毕竟前端出生,找(qi)到(shi)了(bing)...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    5.6 如果NULL定义成#defineNULL((char*)0),不就可以向函数传入不转换的NULL了吗? 5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 5.8 NULL可以合法地用作函数指针吗? 5.9 如果NULL和0作为空指针...
  • .htaccess

    2007-07-19 01:51:18
    百度首页 | 百度空间 | 登录 广告停放提高网站流量,centos学习 主页博客相册|个人档案 查看文章 .htaccess怎么用2007-05-16 14:04(文章来源)...这里有一篇很容易让人理解的.htaccess介绍,作为入门文章非常的适合...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

长图怎么加gif