这篇讲的是如何生成一个自定义的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实现自动放大缩小动画所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)