这篇讲的是如何生成一个自定义的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小时内与您取得联系。