全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

这篇讲的是如何生成一个自定义的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  # 放大缩小  # Android自定义圆角ImageView控件  # Android 自定义imageview实现图片缩放实例详解  # Android自定义控件之圆形、圆角ImageView  # Android自定义GestureDetector实现手势ImageView  # android自定义ImageView仿图片上传示例  # Android自定义ImageView实现在图片上添加图层效果  # Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码  # Android 自定义圆形头像CircleImageView支持加载网络图片的实现代码  # Android自定义圆角ImageView  # Android布局自定义Shap圆形ImageView可以单独设置背景与图片  # Android编程实现自定义ImageView圆图功能的方法  # 加载  # 自定义  # 多说  # 的是  # 我想  # 几个  # 这篇  # 全屏  # 所获  # 第一种  # 配置文件  # 大家多多  # 讲的是  # 很诡异  # Bitmap  # mHandler  # srcRect  # Rect 


相关文章: 怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何在IIS7上新建站点并设置安全权限?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  淘宝制作网站有哪些,淘宝网官网主页?  如何高效配置IIS服务器搭建网站?  宝塔建站助手安装配置与建站模板使用全流程解析  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何选择建站程序?包含哪些必备功能与类型?  如何通过虚拟主机空间快速建站?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在万网自助建站中设置域名及备案?  建站之星与建站宝盒如何选择最佳方案?  如何通过虚拟主机快速完成网站搭建?  海南网站制作公司有哪些,海口网是哪家的?  在线制作视频网站免费,都有哪些好的动漫网站?  如何在阿里云域名上完成建站全流程?  建站之星展会模版如何一键下载生成?  建站主机选虚拟主机还是云服务器更好?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  c# await 一个已经完成的Task会发生什么  网页设计与网站制作内容,怎样注册网站?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  红河网站制作公司,红河事业单位身份证如何上传?  如何在新浪SAE免费搭建个人博客?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  如何在Golang中指定模块版本_使用go.mod控制版本号  三星网站视频制作教程下载,三星w23网页如何全屏?  ,网站推广常用方法?  定制建站策划方案_专业建站与网站建设方案一站式指南  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  建站之星备案是否影响网站上线时间?  网站制作难吗安全吗,做一个网站需要多久时间?  宝塔建站无法访问?如何排查配置与端口问题?  建站主机SSH密钥生成步骤及常见问题解答?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  ui设计制作网站有哪些,手机UI设计网址吗?  网站app免费制作软件,能免费看各大网站视频的手机app?  专业网站建设制作报价,网页设计制作要考什么证?  如何通过西部建站助手安装IIS服务器?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何选择高效响应式自助建站源码系统?  宁波自助建站系统如何快速打造专业企业网站?  b2c电商网站制作流程,b2c水平综合的电商平台?  网站制作价目表怎么做,珍爱网婚介费用多少?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。