Android自定义ImageView实现自动放大缩小动画

Android自定义ImageView实现自动放大缩小动画,第1张

概述这篇讲的是如何生成一个自定义的ImageView,实现自动放大缩小动画。为什么实现这个功能呢?因为我想在ViewPager实现图片放大缩小的动画,但是ViewPager几个页面的动画会一起动,而且放大全屏图片的话会相互覆盖,很

这篇讲的是如何生成一个自定义的ImageVIEw,实现自动放大缩小动画。

为什么实现这个功能呢?因为我想在VIEwPager实现图片放大缩小的动画,但是VIEwPager几个页面的动画会一起动,而且放大全屏图片的话会相互覆盖,很诡异。于是上网搜demo,一无所获。迫于无奈。。。
废话不多说,直接贴代码。

1.配置文件直接添加

当直接在布局文件中添加图片的话,可以在自定义view代码中用getDrawable()获取图片资源,然后通过DrawBitmap绘制图片。通过不断绘制图片的位置,达到放大缩小的功能。
第一种情况实在XML布局文件中直接添加的:

public class CoolimageVIEw extends ImageVIEw {  private int mleft = 0;  private int mtop = 0;  private Handler mHandler;  private Bitmap bitmap;  private Rect srcRect = new Rect();  private Rect dstRect = new Rect();  private int imgWIDth;  private int imgHeight;  private boolean flag;  private boolean istart;  public CoolimageVIEw(Context context) {    super(context);  }  public CoolimageVIEw(Context context,AttributeSet attrs) {    super(context,attrs);    setUp(context,attrs);  }  public CoolimageVIEw(Context context,AttributeSet attrs,int defStyleAttr) {    super(context,attrs,defStyleAttr);    setUp(context,attrs);  }  private voID setUp(Context context,AttributeSet attrs) {    mHandler = new MoveHandler();    mHandler.sendEmptyMessageDelayed(1,220L);    istart = true;  }  @OverrIDe  protected voID onDraw(Canvas canvas) {    super.onDraw(canvas);    int wIDth = getWIDth();    int height = getHeight();    //获取图片资源    BitmapDrawable drawable = (BitmapDrawable) getDrawable();    bitmap = drawable.getBitmap();    dstRect.left = 0;    dstRect.top = 0;    dstRect.right = wIDth;    dstRect.bottom = height;    if (bitmap != null) {      if (istart) {//        获取图片的宽高        imgWIDth = bitmap.getWIDth();        imgHeight = bitmap.getHeight();        srcRect.left = 0 + mleft;        srcRect.right = imgWIDth - mleft;        srcRect.top = 0 + mtop;        srcRect.bottom = imgHeight - mtop;        canvas.drawBitmap(bitmap,srcRect,dstRect,null);      } else {        canvas.drawBitmap(bitmap,null,null);      }    }  }  private class MoveHandler extends Handler {    @OverrIDe    public voID handleMessage(Message msg) {      switch (msg.what) {        case 1:          if (imgHeight != 0) {            if (mtop == 0) {              mtop += 5;              mleft += 5;            } else if (mtop == 120) {              mtop -= 5;              mleft -= 5;            }          }          postInvalIDate();          mHandler.sendEmptyMessageDelayed(1,250);          break;      }    }  }  public voID start() {    mtop = 0;    mleft = 0;    istart = true;    mHandler.sendEmptyMessageDelayed(1,220L);  }  public voID stop() {    istart = false;  }}

2 .通过GlIDe加载图片的方式

通过GlIDe加载图片的话,不能直接用getDrawable获取图片资源。GlIDe加载图片的方式也需要改变。废话不多说,直接上代码。
CoolimageVIEw直接从GlIDe的缓存中加载图片。

GlIDe.with(GoodsPagerActivity.this)            .load(sList.get(position).img)            .overrIDe(wIDth,height)            .centerCrop()            .into(new SimpleTarget<GlIDeDrawable>() {              @OverrIDe              public voID onResourceReady(GlIDeDrawable resource,GlIDeAnimation<? super GlIDeDrawable> glIDeAnimation) {                imageVIEw.setimageDrawable(resource);              }            });

CoolimageVIEw.java:
唯一不同的是获取图片的方式;
```java

public class CoolimageVIEw extends ImageVIEw {  private int mleft = 0;  private int mtop = 0;  private Handler mHandler;  private Bitmap bitmap;  private Rect srcRect = new Rect();  private Rect dstRect = new Rect();  private int imgWIDth;  private int imgHeight;  private boolean flag;  private boolean istart;  private int wIDth;  private int height;  public CoolimageVIEw(Context context) {    super(context);  }  public CoolimageVIEw(Context context,220L);    istart = true;  }  @OverrIDe  public voID setimageDrawable(@Nullable Drawable drawable) {    super.setimageDrawable(drawable);    if (mHandler != null) {      mHandler.sendEmptyMessageDelayed(1,220L);    } else {      mHandler = new MoveHandler();      mHandler.sendEmptyMessageDelayed(1,220L);      istart = true;    }  }  @OverrIDe  protected voID onDraw(Canvas canvas) {    super.onDraw(canvas);    wIDth = getWIDth();    height = getHeight();    GlIDeBitmapDrawable drawable = (GlIDeBitmapDrawable) getDrawable();    if (drawable != null) {      bitmap = drawable.getBitmap();    }    dstRect.left = 0;    dstRect.top = 0;    dstRect.right = wIDth;    dstRect.bottom = height;    if (bitmap != null) {      if (istart) {        imgWIDth = bitmap.getWIDth();        imgHeight = bitmap.getHeight();        srcRect.left = 0 + mleft;        srcRect.right = imgWIDth - mleft;        srcRect.top = 0 + mtop;        srcRect.bottom = imgHeight - mtop;        canvas.drawBitmap(bitmap,null);      }    }  }  private class MoveHandler extends Handler {    @OverrIDe    public voID handleMessage(Message msg) {      switch (msg.what) {        case 1:          if (imgHeight != 0) {            if (mtop == 0) {              flag = true;            } else if (mtop == 60) {              flag = false;            }            if (!flag) {              mtop -= 2;              mleft -= 1;            } else {              mtop += 2;              mleft += 1;            }          }          postInvalIDate();          mHandler.sendEmptyMessageDelayed(1,200);          break;      }    }  }  public voID start() {    mtop = 0;    mleft = 0;    istart = true;    mHandler.sendEmptyMessageDelayed(1,220L);  }  public voID stop() {    istart = false;  }}

如果感觉动画不够流畅可以缩小线程等待时间。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android自定义ImageView实现自动放大缩小动画全部内容,希望文章能够帮你解决Android自定义ImageView实现自动放大缩小动画所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存