第四章 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 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
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的内容。   手机屏幕是一个中空的盖板,盖板下面是一个巨大的画布,也就是我们想要显示的视图。当把这个盖板盖在画布上的某一处时,则被盖板盖住了无法看见。我们的视图与这个例子很相似,我们没有看见视图,并不代表它并不存在,有可能只是在屏幕外而已。
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
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

更多相关文章

  1. Android基本控件常用属性及方法
  2. Android中一个Activity多个intent-filter的调用方法
  3. Android模拟SD卡实现方法解析
  4. Android编程实现屏幕自适应方向尺寸与分辨率的方法
  5. Android Studio导入Project的方法
  6. Android使用AudioRecord遇到的问题与解决方法
  7. 另类方法屏蔽Android4.03的HOME按键
  8. android SDK更新方法总结
  9. android设置Activity背景色为透明的2种方法

随机推荐

  1. java中的Unicode到String但很棘手
  2. hbase中出现的java.net.BindException-Pr
  3. 处理“您确定您想要离开这个页面”Msg在S
  4. javascript 操作流——回调的回调
  5. Java中字符流和字节流到底有什么区别!!!
  6. 5个java面试题。。。请高手给个答案。。
  7. java中匹配字符串中的中文字符(含中文标
  8. Java nio 学习笔记(一) Buffer(缓冲区)与Chan
  9. 如何知道Object是否为String类型对象?
  10. Java实现图像对比类