Android控件架构和自定义控件
Android界面的架构图如下:
每个Activity都包含一个Window对象。DecorView作为窗口的顶层视图。
View的测量和绘制
MeasureSpec类用来测量view。
三种测量模式:
-
EXACTLY
精确模式,我们将控件的layout_width或者layout_height指定为具体数值时,使用这种模式。 -
AT_MOST
最大值模式,控件的layout_width或者layout_height指定为wrap_content时,控件大小一般随着内容或者子控件变化而变化。此时控件尺寸只要不超过父控件允许的最大值即可。 -
UNSPECIFIED
不指定大小的测量模式,view想要多大就多大,通常情况下在自定义view时才会用到。
View类默认onMeasure()方法只支持EXACTLY 模式。
Android事件拦截机制
ViewGroup类的方法:dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()
View类的方法:dispatchTouchEvent()、onTouchEvent()
ListView的使用技巧
- setEmptyView
调用这个方法,可以在无数据时显示View,有数据时不会显示这个View - 重写overScrollBy方法,实现阻尼效果
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY,
int scrollRangeX, int scrollRangeY,
int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
scrollRangeX, scrollRangeY, maxOverScrollX, 500, isTouchEvent);
}
Android Scroll分析
实现滑动的七种方法
- layout
在自定义View中监听onTouchEvent方法计算位置偏移量,然后调用layout方法 - offsetLeftAndRight、offsetTopAndBottom
在自定义View中监听onTouchEvent方法计算位置偏移量,然后调用offsetLeftAndRight、offsetTopAndBottom方法 - LayoutParams
动态改变LayoutParams - scrollTo、scrollBy
View中调用这两个方法,移动的是View的内容;ViewGroup调用这两个方法,移动的是它的字View - Scroller
Scroller用来实现平滑移动。步骤为:构造Scroller实例;重写View的computerScroll方法;调用Scroller的startScroll方法。
@Override
public void computeScroll() {
super.computeScroll();
if(mScroller.computeScrollOffset()){
((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
invalidate();
}
}
- 属性动画
- ViewDragHelper
ViewDragHelper用来解决滑动,使用步骤为:构造ViewDragHelper实例;重写View的onInterceptTouchEvent、onTouchEvent方法,将事件交由ViewDragHelper处理;重写View的computerScroll方法;处理ViewDragHelper的回调接口
Android动画机制与使用技巧
- 属性动画
当属性动画所作用的属性没有get、set方法时,可以通过定义一个包装类来间接实现get、set方法;或者通过ValueAnimator来实现。 - SVG矢量动画
与Bitmap相比,SVG具有放大不失真、无需为不同的分辨率提供多套图标等优点。
Activity安全机制
可以从下面几个方面加强APP的安全:
- 代码安全机制------混淆
- APP接入权限控制------AndroidMainifest.xml文件权限声明、权限检查机制
- APP签名机制------数字证书
- Linux内核安全机制------UID、访问权限控制
- Android虚拟机沙箱机制------沙箱隔离