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

作者:guangyu_sun 时间:2021-11-07 12:24:48 

这篇讲的是如何生成一个自定义的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, dstRect, 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, 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
 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, srcRect, dstRect, null);
     } else {
       canvas.drawBitmap(bitmap, null, dstRect, 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,放大缩小
0
投稿

猜你喜欢

  • Android实现截图和分享功能的代码

    2023-04-09 22:56:43
  • Unity之绕轴进行旋转的操作

    2021-11-14 17:53:10
  • java搜索无向图中两点之间所有路径的算法

    2023-11-10 09:28:26
  • C#获取系统版本信息方法

    2022-12-13 04:45:20
  • 浅谈Android Studio导出javadoc文档操作及问题的解决

    2023-07-07 14:32:53
  • Android AS创建自定义布局案例详解

    2022-04-28 22:20:41
  • Path类 操作文件类的实例

    2023-09-27 12:53:33
  • maven将项目打包上传到nexus私服的详细教程

    2023-04-18 16:20:22
  • 轻松学习C#的属性

    2022-07-21 06:24:04
  • Java虚拟机JVM性能优化(二):编译器

    2023-12-03 21:21:57
  • Java动态代理模式的深入揭秘

    2023-07-27 23:41:25
  • AndroidStudio实现微信界面设计

    2022-09-16 22:45:40
  • Java 数组元素倒序的三种方式(小结)

    2022-04-01 22:59:19
  • Android可签到日历控件的实现方法

    2023-11-18 15:11:28
  • mybatis查询返回Map<String,Object>类型的讲解

    2022-12-25 02:07:38
  • Springboot基于websocket实现简单在线聊天功能

    2023-12-21 08:58:18
  • Android CardView详解及使用方法和实例

    2023-01-11 01:04:30
  • 配置SpringBoot方便的切换jar和war的方法示例

    2023-11-22 11:57:54
  • 利用Java连接Hadoop进行编程

    2022-11-12 09:02:12
  • c#中虚函数的相关使用方法

    2022-10-25 05:44:53
  • asp之家 软件编程 m.aspxhome.com