最近看到网上有同志在讲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让图片慢慢画出来相关推荐

  1. 自定义初学5——自定义View显示图片

    前面已经简单介绍过一些自定义View的实现,现在再利用自定义View实现显示一张图片的功能 1.首先编写attrs.xml文件 <resources>     <declare-st ...

  2. 安卓自定义 View 进阶: 图片文字

    一.Canvas的常用操作速查表 操作类型 相关API 备注 绘制颜色 drawColor, drawRGB, drawARGB 使用单一颜色填充整个画布 绘制基本形状 drawPoint, draw ...

  3. android中使用自定义View让图片像画卷一样被展开显示

    首先看下效果图,有点卡顿,这是因为我是用android studio的screen record来录制手机视频的,然后找不到合适的mp4->gif的软件,就使用了一个录屏的软件,所以有点卡顿,但 ...

  4. android画a4矩形,Android自定义View绘制原理:画多大?画在哪?画什么?(三)

    View绘制就好比画画,抛开Android概念,如果要画一张图,首先会想到哪几个基本问题: 画多大? 画在哪? 怎么画? Android绘制系统也是按照这个思路对View进行绘制,上面这些问题的答案分 ...

  5. 自定义View实现图片的绘制、旋转、缩放

    1.图片 把一张JPG图片改名为image.jpg,然后拷贝到项目的res-drawable中. 2.activity_main.xml 1 <LinearLayout xmlns:androi ...

  6. Android自定义View实现图片放大,平移和显示大图片

    原文地址 图片如果不显示:点击这里 前言 首先分析一下需求:将一个图片显示在屏幕上,并能够对其放大或者平移. 用 canvas 画 bitmap 主要有这么几个方法. void drawBitmap( ...

  7. 自定义view - 收藏集 - 掘金

    Android 从 0 开始自定义控件之 View 的 draw 过程 (九) - Android - 掘金 转载请标明出处: http://blog.csdn.net/airsaid/... 本文出 ...

  8. Android自定义View 实现窗帘控件

    需求分析 这里只作简单介绍,最后会分享源码地址 窗帘分为三部分,上面的窗帘杆,杆下面的窗帘布,以及布中间的滑块,实现还是蛮简单的,我们可以通过自定义view把这个窗帘画出来 窗帘杆是一个上面是圆角,下 ...

  9. android显示绘图动画,Android自定义View绘图实现渐隐动画

    实现了一个有趣的小东西:使用自定义view绘图,一边画线,画出的线条渐渐变淡,直到消失.效果如下图所示: 用属性动画或者渐变填充(shader)可以做到一笔一笔的变化,但要想一笔渐变(手指不抬起边画边 ...

最新文章

  1. spring elasticsearch 按条件删除_Elasticsearch系列之Query DSL
  2. SQL查询入门(下篇)
  3. WinCE启动失败的原因与解决办法分析
  4. Keil的可重定位段
  5. 周思进:自知“能力不足“让我专注十几年音视频
  6. Angular应用动态创建style标签页的场景
  7. 计算机文字处理操作题33,2017年国家计算机等级考试试题【文字处理】.doc
  8. 开源视频质量评价工具: Evalvid
  9. 分页组件change_javascript原生瀑布流+图片懒加载组件
  10. bspline怎么使用 python_零基础5个月快速学会Python的秘诀
  11. 微信小程序学习日记---模板(template)全解析
  12. Cloudera迁移scm数据库
  13. 推荐 4 个开源小程序
  14. python绝对值_绝对值排序 (Python代码)
  15. [SiFi]三体中英名词翻译chapter1-3
  16. C#/VB.NET 读取条码类型及条码在图片中的坐标位置
  17. android中抽屉控件,Android自定义控件:类QQ抽屉效果
  18. oracle 修改lsnrctl,Oracle中 lsnrctl命令使用总结(推荐)
  19. 什么是动态域名解析服务?
  20. 2018黑马前端视频教程视频与源码全

热门文章

  1. cad怎么输出pdf文件?
  2. PS扣取比较复杂的头发
  3. 清除缓存?(浏览器)
  4. 5.3.1 Premiere Pro CS4视频处理
  5. linux crontab文件,crontab用法与实例
  6. ijkplayer播放器详解使用教程
  7. 【Cocos游戏】《Monster Strike》风头强劲 Mixi市值一路看涨
  8. php电影选座功能,电影选座系统,挺简单的适合新手看
  9. Kaggle | Titanic - Machine Learning from Disaster【泰坦尼克号生存预测】 | baseline及优秀notebook总结
  10. js基本类型与引用类型