Android View 的滑动冲突

01.什么是滑动冲突

  • 当父容器与子 View 都可以滑动时,就会产生滑动冲突。
  • 解决 View 之间的滑动冲突的方法分为两种,分别是外部拦截法和内部拦截法

02.外部拦截法

  • 父容器根据需要在 onInterceptTouchEvent 方法中对触摸事件进行选择性拦截,思路可以看以下伪代码

阅读更多

Android View 事件分发场景

01.事件分发背景描述

  • 讨论的布局层次如下:
    • 最外层:Activiy A,包含两个子View:ViewGroup B、View C
    • 中间层:ViewGroup B,包含一个子View:View C
    • 最内层:View C
  • 触摸情况
    • 假设用户首先触摸到屏幕上View C上的某个点(如图中黄色区域),那么Action_DOWN事件就在该点产生,然后用户移动手指并最后离开屏幕。
阅读更多

Android View 事件机制源码分析

01.Android中事件分发顺序

  • Android中事件分发顺序:
    • Activity(Window) -> ViewGroup -> View
  • 其中:
    • super:调用父类方法
    • true:消费事件,即事件不继续往下传递
    • false:不消费事件,事件继续往下传递 / 交由给父控件onTouchEvent()处理
阅读更多

Android View 事件基础

01.事件分发概念

1.1 事件分发的对象是谁

  • 事件分发的对象是事件。注意,事件分发是向下传递的,也就是父到子的顺序。
  • 当用户触摸屏幕时(View或ViewGroup派生的控件),将产生点击事件(Touch事件)。
    • Touch事件相关细节(发生触摸的位置、时间、历史记录、手势动作等)被封装成MotionEvent对象
阅读更多

Android Android 保存多张图片到本地

01.实际开发保存图片遇到的问题

  • 业务需求

    • 在素材list页面的九宫格素材中,展示网络请求加载的图片。如果用户点击保存按钮,则保存若干张图片到本地。具体做法是,使用glide加载图片,然后设置listener监听,在图片请求成功onResourceReady后,将图片资源resource保存到集合中。这个时候,如果点击保存控件,则循环遍历图片资源集合保存到本地文件夹。
  • 具体做法代码展示

阅读更多

Android 加载大图流程

01.网络请求图片

  • 直接通过http请求网络图片通过流转化成Bitmap。实际开发中一般使用glide去请求加载图片资源。

  • 经过测试,请求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 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;
    }
阅读更多