《Android 群英传》 阅读笔记 第四章~第六章

来源:互联网 发布:购物秒杀软件 编辑:程序博客网 时间:2024/04/30 15:54
第四章 ListView使用技巧
4.1 ListView常用优化技巧 
4.1.1 使用ViewHolder模式提高效率 

4.1.2 设置项目间分隔线 
android:divider="android:color/darker_gray"
android :dividerHeight="10dp"

4.1.3 取消ListView的Item点击效果 
android :listSelector =#00000000

4.1.5 设置listView需要显示在第几项 
listView.setSelection(N)
实现平移滑动
listview.smoothScrollBy(distance,duration)
listview.smoothScrollByOffset(offset)
listview.smoothScrollToPosition(index)

4.1.6 动态修改ListView
mData.add("new");
mAdapter.notifyDataSetChanged();

4.1.7 遍历ListView中的所有item
for(int i=0;i<mlistView.getChildCount();i++){
     
}

4.1.8 处理空ListView
当listView列表中无数据时,ListView不会显示任何数据或提示,按照完善用户体验的需求,这里应该给以无数据的提示。listView提高了一个方法:setEmptyView()。

当用户没有做手指抛动的状态时,这个方法只会回调2次,否则会回调3次,差别就是手指抛动这个状态。
通常情况下,我们会在这个方法中通过不同的状态来设置一些标志Flag,来区分不同的滑动状态,供其他方法处理。

4.2.1 具有弹性的ListView
listview中有一个控制滑动到边缘的处理方法。overScrollBy方法。里面有一个参数maxOverScrollBy,注释中写道,Number of piexls to overscroll by in either direction along the Y axis 。只要修改这个参数的值,就可以让ListView具有弹性了。

4.2.2 自动显示、隐藏布局的ListView

4.2.3 聊天ListView

4.2.4 动态改变ListView

第5章 Android Scroll分析 

5.1 滑动效果是如何产生的 
滑动一个View,本质上来说就是移动一个View。改变其当前所处的位置。
要实现View的滑动,就必须监听用户触摸的事件,并根据事件传入的坐标,动态且不断改变View的坐标,从而实现View跟随用用户触摸的滑动而滑动。

5.1.1 Android 坐标系 
所谓滑动,正式相对于参考系的运动。在Android中,将屏幕最左上角的定义作为Android坐标系的圆点,从这个点的向右为X轴正方向,从这个点向下是Y轴正方向。
系统提供了getLocationOnScreen(int location[])这样的方法来获取Android坐标系中的位置,即该视图左上角在Android坐标系中的坐标。另外,在触控事件中使用getRawX(),getRawY()方法所获得的坐标同样是Android坐标系中的坐标。

5.1.2 视图坐标系 
视图坐标系同样是以原点向后为X轴正方向,以圆点向下为Y轴正方向,只不过在视图坐标系中,原点不再是Android坐标系中的屏幕最左上角,而是以父视图左上角为坐标原点。
通过getX(),getY()所获得坐标就是视图坐标系中的坐标。

5.1.3 触控事件——MotionEvent

graphic
View提供的获取坐标方法
getTop():获取到的是View自身的定边到其父布局顶边的距离
getLeft():获取到的是View自身的左边到其父布局左边的距离
getRight():获取到的是View自身的右边到其父布局左边的距离 
getBottom():获取的是View自身的底边到其父布局顶边的距离

MotionEvent提供的方法
getX():获取点击事件距离控件左边的距离,即视图坐标。
getY():获取点击事件距离控件顶边的距离,即视图坐标。

getRawX():获取点击事件距离整个屏幕左边的距离,即绝对坐标。
getRawY():获取点击事件距离整个屏幕顶边的距离,即绝对坐标

5.2实现滑动的七种方法
当触摸View时,系统记下当前触摸点坐标;当手指移动时,系统记下移动后的触摸点坐标。从而获取到前一次坐标点的偏移量,通过偏移量来修改View的坐标,这样不断重复,从而实现滑动过程。

5.2.1 layout方法 
在View绘制时,会调用onLayout方法来设置显示的位置。同样,可以通过修改View的Left,top,bottom四个属性来控制View的坐标。
使用绝对坐标系,有一条非常需要注意的地方,就是在每次执行完Action_move的逻辑后,一定要重新设置初始坐标,这样才能转却获取偏移量。

5.2.2 offleftAndRight()与offsetTopAndBottom()
这个方法相当于系统提供一个对左右、上下移动的API封装,当计算出偏移量后,只需要使用如下代码,就可以完成View的重新布局。

5.2.3 LayoutParams
LayoutParams保存了一个View的布局参数。因此可以在程序中,通过改变LayoutParams来动态地修改一个布局的位置参数,从而达到改变View位置的效果。我们可以很方便地在程序中使用getLayoutParams()来获取一个View的LayoutParams。
当然,计算偏移量的方法与在Layout方法中计算offset也是一样。当获取到偏移量之后,就可以通过setLayoutParams来改变其LayouParams。
 
5.2.4 scrollto 与scrollBy
scrollTo(x,y)表示移动到一个具体的坐标点(x,y)
scrollBy (dx,dy)表示移动的增量为dx,dy。

 scrollTo,scrollBy方法移动的是View的content。即让View的内容移动。
如果在ViewGroup中使用scrollTo,scrollBy方法,那么移动的将是所有子View。
如果在View中使用,那么移动的将是View的内容。
 
手机屏幕是一个中空的盖板,盖板下面是一个巨大的画布,也就是我们想要显示的视图。当把这个盖板盖在画布上的某一处时,则被盖板盖住了无法看见。我们的视图与这个例子很相似,我们没有看见视图,并不代表它并不存在,有可能只是在屏幕外而已。
graphic

5.2.5 Scroller 
     Scroller类就这样应运而生了,通过Scroller类可以实现平移滑动的效果,而不再是瞬间完成的移动。
使用Scroller类需要三个步骤
1、初始化Scroller     
2、重写computerScroll()方法,实现模拟滑动 
系统在绘制View的时候会在Draw()方法中调用该方法

5.2.7 ViewDragHelper

1、初始化ViewDragHelper
它的第一个参数是监听的View,通常需要一个ViewGroup
第二个参数是一个Callback回调。

2、拦截事件
重写事件拦截方法,将事件传递给ViewDragHelper

3、处理computeScroll()
使用ViewDragHelper同样需要重写下computeScroll()方法。因为ViewDragHelper内部也是通过Scroller来实现平滑移动的。

4、处理回调CallBack
重写了tryCaptureView()方法。通过这个方法,我们可以指定在创建ViewDragHelper时,参数parentView中的哪一个子View可以被移动。

5、下面来看具体的滑动方法
clampViewoPositionVertical()和clampViewPositonHorizontal()。
如果要实现滑动效果,那么这两个方法必须要重写。因为当返回值为0,即不发生滑动。

6、优化这个实例
在ViewDragHelper.Callback中,系统提供了这样的方法——onViewReleased()。通过重写这个方法,可以简单地实现当手指离开屏幕后实现的操作。

7、最后一步
在自定义ViewGroup的onFinishInflate()方法中,按顺序将子View分别定义成MenuView和MainView,并在onSizeChanged()方法中获得View的宽度。

onViewCaptured()
在用户触摸到View后回调

onViewDragStateChanged()
这个事件在拖拽状态改变时回调,比如,idle,dragging等状态

onViewPositionChanged()
这个事件在位置改变时回调,常用与滑动时改变scale进行缩放等效果。

第6章 Android绘图机制与处理技巧
Android的绘图机制应该是Android最核心的内容之一。
1、Android屏幕相关知识
2、Android绘图技巧
3、Android图像处理技巧
4、SurfaceView的使用

6.1 屏幕的尺寸信息
6.1.1 屏幕参数
1、屏幕大小 
屏幕对角线的长度,通常使用寸来度量,例如。4.7寸手机,5.5寸手机
2、分辨率
分辨率是指屏幕的像素点个数。例如,720x1280就是指屏幕的分辨率,指宽有720个像素点,高有1280个像素点。
3、PPI
每英寸像素,又成为DPI。它是由对角线的像素点除以屏幕的大小得到的。

6.1.2系统屏幕密度
手机固定的DPI
graphic

6.1.3独立像素密度 dp
相同长度的屏幕,高密度的屏幕包含更多的像素点。
Android系统使用mdpi即密度值为160的屏幕作为标准,在这个屏幕上,1px=1dp。
其他屏幕可以通过比例进行换算。
我们也可以得到各个分辨率直接的换算比例:
ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12。

6.1.4 单位转换

6.2 2D绘图基础
系统通过提供的canvas对象来提供绘图方法。它提供了各种绘制图像的API。
如drawPoint(点),drawLine(线),drawRect(矩形),drawVertices(多边形),drawArc(弧),drawCircle(圆)。
1、setAntiAlias //设置画笔的锯齿效果      2、setColor() 设置画笔的颜色 
3、setARGB() 设置画笔的A、R、G 、B值  4、setAlpha()设置画笔的alpha值 
5、setTextSize() 设置字体的尺寸              6、setStyle()设置画笔的风格(空心或实心)                                          7、setStrokeWidth()设置空心边框的宽度


需要注意:
绘制弧形和扇形的区分就是倒数第二个参数userCenter的区别。
Paint.Style.STROKE+useCenter(true);
Paint.Style.STROKE+useCenter(false);

6.3 Android XML绘图 

6.4.1 Canvas
canvas.save() 从字面上可以理解为保存画布。它的作用就是将之前的所有已绘制图像保存起来,让后续的操作就好像在一个新的图层上操作一样
canvase.restore(),即合并图层,将save()之后绘制的所有图像与save()之前的图像进行合并。
canvas.translate() 画布平移,
canvas.rotate()     画布翻转

119页
将画布以圆心为原点旋转到需要的角度。每当画好一根线,就旋转相应的角度。
虽然下一次画线的时候,依然是第一根线的坐标,但是实际上当我们把画布重新还原到旋转钱的位置时,所有的刻度线就已经全部画好了。
通过旋转画布,实际上是旋转了画图的坐标系。

6.4.2 Layer图层 
Android 通过调用saveLayer()方法,saveLayerAlpha()方法将一个图层入栈,使用restore()方法、restoreToCount()方法将一个图层出栈。入栈的时候,后面所有的操作都发生在这个图层上,而出栈的时候,则会把图像会知道上层canvas上。

6.5 Android 图像处理之色彩特效处理
Android最长使用到的数据结构是位图——Bitmap。它包含了一张图片所有的数据。整个图片都是由点阵和颜色值组成。所谓点阵就是一个包含像素的矩阵,每一个元素对应着图片的一个像素。而颜色值——ARGB。

6.5.1 色彩矩阵分析 
在色彩处理中,通常使用以下三个角度来描述一个图像。
1、色调——物体传播的颜色
2、饱和度——颜色的纯度,从0到100%来进行描述
3、亮度——颜色的相对明暗程度。

6.8 surfaceView 
View 通过刷新来重绘视图,Android通过发出VSYNC信号来进行屏幕的重绘,刷新的间隔事件为16ms。
SurfaceView与View的区别在于
1、View主要适用于主动更新的情况下,而SurfaceView主要适用于被动更新。例如,频繁的刷新
2、View在诛仙城中对画面进行刷新,而SurfaceView通常会通过一个子线程来进行页面的刷新
3、View在绘图时没有使用双缓冲机制,而SurfaceView在底层实现机制中就已经实现了双缓冲机制。
总之:如果你的自定义View需要频繁刷新,或者刷新时数据处理量比较大,那么就可以考虑用SurfaceView来取代View了。

6.8.2 SurfaceView的使用
1、创建SurfaceView

0 0
原创粉丝点击