这篇讲的是如何生成一个自定义的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
相关文章:
高性能网站服务器配置指南:安全稳定与高效建站核心方案
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何解决VPS建站LNMP环境配置常见问题?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
建站之星会员如何解锁更多建站功能?
如何在橙子建站上传落地页?操作指南详解
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
如何在建站之星网店版论坛获取技术支持?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
如何通过宝塔面板实现本地网站访问?
全景视频制作网站有哪些,全景图怎么做成网页?
深圳网站制作的公司有哪些,dido官方网站?
制作农业网站的软件,比较好的农业网站推荐一下?
Python路径拼接规范_跨平台处理说明【指导】
建站主机如何安装配置?新手必看操作指南
动图在线制作网站有哪些,滑动动图图集怎么做?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在腾讯云服务器快速搭建个人网站?
MySQL查询结果复制到新表的方法(更新、插入)
如何通过建站之星自助学习解决操作问题?
如何有效防御Web建站篡改攻击?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何选择美橙互联多站合一建站方案?
淘宝制作网站有哪些,淘宝网官网主页?
建站之星伪静态规则如何设置?
如何确认建站备案号应放置的具体位置?
如何选择CMS系统实现快速建站与SEO优化?
临沂网站制作企业,临沂第三中学官方网站?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
如何在香港服务器上快速搭建免备案网站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
昆明高端网站制作公司,昆明公租房申请网上登录入口?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
建站为何优先选择香港服务器?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
个人网站制作流程图片大全,个人网站如何注销?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何在阿里云ECS服务器部署织梦CMS网站?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
如何选购建站域名与空间?自助平台全解析
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
官网网站制作腾讯审核要多久,联想路由器newifi官网
如何选择高性价比服务器搭建个人网站?
高性价比服务器租赁——企业级配置与24小时运维服务
中山网站推广排名,中山信息港登录入口?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。