Android SurfaceView 源码分析

01.Android中绘制模型

1.1 软件绘制模型

  • 这里由CPU主导绘图,视图按照以下2个步骤绘图。
    • 让视图结构(view hierarchy)失效。
    • 绘制整个视图结构。
  • 当应用程序需要更新它的部分UI时,都会调用内容发生改变的View对象的invalidate()方法。无效(invalidation)消息请求会在View对象层次结构中传递,以便计算出需要重绘的屏幕区域(脏区)。然后,Android系统会在View层次结构中绘制所有的跟脏区相交的区域。但是,这种方法有两个缺点:
阅读更多

Android Bitmap 图片处理

1.Bitmap,Drawable,InputStream,Byte[ ] 之间进行转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* Drawable转化成Bitmap
* @param drawable drawable
* @return Bitmap
*/
public static Bitmap drawableToBitmap(Drawable drawable) {
int intrinsicWidth = drawable.getIntrinsicWidth();
int intrinsicHeight = drawable.getIntrinsicHeight();
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE
? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight,config);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, intrinsicWidth, intrinsicHeight);
drawable.draw(canvas);
return bitmap;
}

/**
* Bitmap转换成Drawable
* @param resources resources
* @param bm bm
* @return
*/
public static Drawable bitmapToDrawable(Resources resources, Bitmap bm) {
Drawable drawable = new BitmapDrawable(resources, bm);
return drawable;
}

/**
* InputStream转换成Bitmap
* @param is InputStream流
* @return
*/
public static Bitmap bitmapToDrawable(InputStream is) {
Bitmap bitmap = BitmapFactory.decodeStream(is);
return bitmap;
}
阅读更多

Android Bitmap 压缩处理

00.Bitmap的压缩方式

  • 常见压缩方法Api
    • Bitmap.compress(),质量压缩,不会对内存产生影响;
    • BitmapFactory.Options.inSampleSize,内存压缩;
  • Bitmap.compress()质量压缩
    • 质量压缩,不会对内存产生影响
    • 它是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的,不会减少图片的像素。进过它压缩的图片文件大小会变小,但是解码成bitmap后占得内存是不变的。
阅读更多

Android Bitmap 回收问题

01.recycle()方法

  • 如何调用这个recycle()方法

    1
    2
    3
    4
    if (bitmap != null && !bitmap.isRecycled()) {
    bitmap.recycle();
    bitmap = null;
    }
阅读更多

Android Bitmap 计算内存

01.如何计算占用内存

  • 如果图片要显示下Android设备上,ImageView最终是要加载Bitmap对象的,就要考虑单个Bitmap对象的内存占用了,如何计算一张图片的加载到内存的占用呢?其实就是所有像素的内存占用总和:
  • bitmap内存大小 = 图片长度 x 图片宽度 x 单位像素占用的字节数
  • 起决定因素就是最后那个参数了,Bitmap’常见有2种编码方式:ARGB_8888和RGB_565,ARGB_8888每个像素点4个byte,RGB_565是2个byte,一般都采用ARGB_8888这种。那么常见的1080*1920的图片内存占用就是:1920 x 1080 x 4 = 7.9M
阅读更多

Android 加载图片资源介绍

01.加载Bitmap

1.1 什么是bitmap

  • 位图文件(Bitmap),扩展名可以是.bmp或者.dib。位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。位图文件是非压缩格式的,需要占用较大存储空间。
阅读更多

Android 图片相关整理

01.网络请求图片资源

1.1 直接通过http请求网络图片通过流转化成Bitmap

  • 经过测试,请求8张图片,耗时毫秒值174。如果是服务器响应速度一般,耗时需要2秒【正式接口】。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /**
    * 请求网络图片转化成bitmap
    * @param url url
    * @return 将url图片转化成bitmap对象
    */
    private static long time = 0;
    public static Bitmap returnBitMap(String url) {
    long l1 = System.currentTimeMillis();
    URL myFileUrl = null;
    Bitmap bitmap = null;
    HttpURLConnection conn = null;
    InputStream is = null;
    try {
    myFileUrl = new URL(url);
    } catch (MalformedURLException e) {
    e.printStackTrace();
    }
    try {
    conn = (HttpURLConnection) myFileUrl.openConnection();
    conn.setConnectTimeout(10000);
    conn.setReadTimeout(5000);
    conn.setDoInput(true);
    conn.connect();
    is = conn.getInputStream();
    bitmap = BitmapFactory.decodeStream(is);
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    if (is != null) {
    is.close();
    conn.disconnect();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    long l2 = System.currentTimeMillis();
    time = (l2-l1) + time;
    LogUtils.e("毫秒值"+time);
    //保存
    }
    return bitmap;
    }
阅读更多

Android 消息机制 ThreadLocal

01.Android消息机制

  • 说起Android消息机制,老生常谈的问题,Handler,Looper,MessageQueue,Message这几个都是离不开的话题,不同的类承载不同的功能,首先还是简单的总结下各自的功能:
    • Handler:发送和处理消息
    • MessageQueue:消息队列,采用单链表结构存储数据
    • Looper:调用loop()轮询消息
    • Message:需要发送的内容,消息
阅读更多

Android HandlerThread

01.HandlerThread介绍

1.1 HandlerThread定义

  • HandlerThread是个什么东西,是一个hanlder还是thread,还是别猜了,直接看一下类的定义吧,英文看不懂,可以找翻译?

阅读更多

Android 子线程更新 UI

01.Android中子线程可以更新UI吗

  • 出自《Android艺术探索》
  • 这是因为Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那么为什么系统不对UI控件的访问加上锁机制呢?缺点有两个:
    • ①首先加上锁机制会让UI访问的逻辑变得复杂
    • ②锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行。
    • 所以最简单且高效的方法就是采用单线程模型来处理UI操作。
阅读更多