自定义view让图片慢慢画出来
最近看到网上有同志在讲drawBitmap的时候,提到分段画,感觉很有意思便研究了下。大家也可以阅读原博客android中使用自定义View让图片像画卷一样被展开显示,还是博主文采好,起名字就看得出来。在基础上改进了一下,自定义的view可以定制自己的图片,可以等比例压缩图片如果图片尺寸太大的情况下,上图先。
现在上代码,注释比较详细。
public class DrawBitmapView extends ImageView {private Bitmap bitmap;//每次刷新比上一次多显示图片的比例private float step = 0.01f;//已经显示图片的比例private float currentScale = 0.0f;//显示图片的区域private RectF dst;private Rect src;private int width;private int height;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 1)invalidate();}};@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//因为这里默认wrap_content时候也是match_parent,没有特别处理,因此这一步可以不必要写,只是出于习惯做法width = MeasureSpec.getSize(widthMeasureSpec);height = MeasureSpec.getSize(heightMeasureSpec);setMeasuredDimension(width, height);}public void initView() {BitmapFactory.Options opts = new BitmapFactory.Options();opts.inSampleSize = 2;//这里是获取定制的drawableDrawable drawable = getDrawable();//将drawable压缩成bitmapbitmap = drawableToBitmap(drawable);dst = new RectF();dst.left = 0;dst.top = 0;dst.bottom = bitmap.getHeight();src = new Rect();src.left = 0;src.top = 0;src.bottom = bitmap.getHeight();}public DrawBitmapViewSingle(Context context, AttributeSet attrs) {super(context, attrs);initView();}/*** 默认从左到右显示*/@Overrideprotected void onDraw(Canvas canvas) {//将bitmap等比例压缩bitmap = zoomBitmap(bitmap, getWidth(), getWidth());currentScale = currentScale + step > 1 ? 1 : currentScale + step;dst.right = bitmap.getWidth() * currentScale;src.right = (int) (bitmap.getWidth() * currentScale); /* * drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint); * Rect src: 是对图片进行裁截,若是空null则显示整个图片 * RectF dst:是图片在Canvas画布中显示的区域, * 大于src则把src的裁截区放大, * 小于src则把src的裁截区缩小。 * 当想要让图片以画卷方式展现的话,主要是设置src大小,这边是默认从左到右显示,所以每次只要修改src中right的大小就好 */canvas.drawBitmap(bitmap, src, dst, null);if (currentScale >= 1) {//当显示完图片,重置,循环显示currentScale = 0 - step;}//不想让整个页面处于频繁刷新的状态,这里延迟了10ms来刷新该页面 handler.sendEmptyMessageDelayed(1, 10);}public static Bitmap drawableToBitmap(Drawable drawable) {Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight(),drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565);Canvas canvas = new Canvas(bitmap);//canvas.setBitmap(bitmap);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());drawable.draw(canvas);return bitmap;}public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {int width = bitmap.getWidth();int height = bitmap.getHeight();Matrix matrix = new Matrix();float scaleWidht = ((float) w / width);float scaleHeight = ((float) h / height);matrix.postScale(scaleWidht, scaleHeight);Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);return newbmp;}
}
因为继承的是imageview,因此设置定制图片的时候,在src属性里设置就可以。
自定义view让图片慢慢画出来相关推荐
- 自定义初学5——自定义View显示图片
前面已经简单介绍过一些自定义View的实现,现在再利用自定义View实现显示一张图片的功能 1.首先编写attrs.xml文件 <resources> <declare-st ...
- 安卓自定义 View 进阶: 图片文字
一.Canvas的常用操作速查表 操作类型 相关API 备注 绘制颜色 drawColor, drawRGB, drawARGB 使用单一颜色填充整个画布 绘制基本形状 drawPoint, draw ...
- android中使用自定义View让图片像画卷一样被展开显示
首先看下效果图,有点卡顿,这是因为我是用android studio的screen record来录制手机视频的,然后找不到合适的mp4->gif的软件,就使用了一个录屏的软件,所以有点卡顿,但 ...
- android画a4矩形,Android自定义View绘制原理:画多大?画在哪?画什么?(三)
View绘制就好比画画,抛开Android概念,如果要画一张图,首先会想到哪几个基本问题: 画多大? 画在哪? 怎么画? Android绘制系统也是按照这个思路对View进行绘制,上面这些问题的答案分 ...
- 自定义View实现图片的绘制、旋转、缩放
1.图片 把一张JPG图片改名为image.jpg,然后拷贝到项目的res-drawable中. 2.activity_main.xml 1 <LinearLayout xmlns:androi ...
- Android自定义View实现图片放大,平移和显示大图片
原文地址 图片如果不显示:点击这里 前言 首先分析一下需求:将一个图片显示在屏幕上,并能够对其放大或者平移. 用 canvas 画 bitmap 主要有这么几个方法. void drawBitmap( ...
- 自定义view - 收藏集 - 掘金
Android 从 0 开始自定义控件之 View 的 draw 过程 (九) - Android - 掘金 转载请标明出处: http://blog.csdn.net/airsaid/... 本文出 ...
- Android自定义View 实现窗帘控件
需求分析 这里只作简单介绍,最后会分享源码地址 窗帘分为三部分,上面的窗帘杆,杆下面的窗帘布,以及布中间的滑块,实现还是蛮简单的,我们可以通过自定义view把这个窗帘画出来 窗帘杆是一个上面是圆角,下 ...
- android显示绘图动画,Android自定义View绘图实现渐隐动画
实现了一个有趣的小东西:使用自定义view绘图,一边画线,画出的线条渐渐变淡,直到消失.效果如下图所示: 用属性动画或者渐变填充(shader)可以做到一笔一笔的变化,但要想一笔渐变(手指不抬起边画边 ...
最新文章
- spring elasticsearch 按条件删除_Elasticsearch系列之Query DSL
- SQL查询入门(下篇)
- WinCE启动失败的原因与解决办法分析
- Keil的可重定位段
- 周思进:自知“能力不足“让我专注十几年音视频
- Angular应用动态创建style标签页的场景
- 计算机文字处理操作题33,2017年国家计算机等级考试试题【文字处理】.doc
- 开源视频质量评价工具: Evalvid
- 分页组件change_javascript原生瀑布流+图片懒加载组件
- bspline怎么使用 python_零基础5个月快速学会Python的秘诀
- 微信小程序学习日记---模板(template)全解析
- Cloudera迁移scm数据库
- 推荐 4 个开源小程序
- python绝对值_绝对值排序 (Python代码)
- [SiFi]三体中英名词翻译chapter1-3
- C#/VB.NET 读取条码类型及条码在图片中的坐标位置
- android中抽屉控件,Android自定义控件:类QQ抽屉效果
- oracle 修改lsnrctl,Oracle中 lsnrctl命令使用总结(推荐)
- 什么是动态域名解析服务?
- 2018黑马前端视频教程视频与源码全
热门文章
- cad怎么输出pdf文件?
- PS扣取比较复杂的头发
- 清除缓存?(浏览器)
- 5.3.1 Premiere Pro CS4视频处理
- linux crontab文件,crontab用法与实例
- ijkplayer播放器详解使用教程
- 【Cocos游戏】《Monster Strike》风头强劲 Mixi市值一路看涨
- php电影选座功能,电影选座系统,挺简单的适合新手看
- Kaggle | Titanic - Machine Learning from Disaster【泰坦尼克号生存预测】 | baseline及优秀notebook总结
- js基本类型与引用类型