自定义view(三)
来源:互联网 发布:淘宝店铺运营公司 编辑:程序博客网 时间:2024/06/16 07:03
仅仅处理绘制还不够,还需要与用户的触摸事件做交互。
处理用户的操作
触摸是最基础的触摸事件。可以重写onTouchEvent(android.view.MotionEvent))响应触摸事件:
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
除了触摸事件,还有其他事件可以监听。
例如tapping,pulling,flinging与zooming。为了监听这些事件。可以继承GestureDetector.SimpleOnGestureListener,重写里面的方法。
public class CustomerGesture extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return super.onSingleTapUp(e);
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
super.onLongPress(e);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return super.onScroll(e1, e2, distanceX, distanceY);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
return super.onFling(e1, e2, velocityX, velocityY);
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
super.onShowPress(e);
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return super.onDown(e);
}
@Override
public boolean onDoubleTap(MotionEvent e) {
// TODO Auto-generated method stub
return super.onDoubleTap(e);
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
return super.onDoubleTapEvent(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
return super.onSingleTapConfirmed(e);
}
}
SimpleOnGestureListener 中的onDown()方法必须实现,并返回true。因为所有的gestures都是从onDown()开始的。如果你在onDown()里面返回false,系统会认为你想要忽略后续的gesture,那么其他回调方法就不会被执行到了。一旦你实现了GestureDetector.OnGestureListener并且创建了GestureDetector的实例, 你可以使用你的GestureDetector来中止你在onTouchEvent里面收到的touch事件。
自定义view注意事项:
1.尽量少在onDraw中分配内存。因为它会导致GC,从而导致卡顿。在初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。
2.还需要尽可能的减少onDraw被调用的次数,大多数时候导致onDraw都是因为调用了invalidate().因此请尽量减少调用invaildate()的次数
3.调用invalidate,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。
4.任何时候执行requestLayout(),会使得Android UI系统去遍历整个View的层级来计算出每一个view的大小。如果找到有冲突的值,它会需要重新计算好几次。另外需要尽量保持View的层级是扁平化的,这样对提高效率很有帮助。
5.,你应该考虑写一个自定义的ViewGroup来执行他的layout操作。与内置的view不同,自定义的view可以使得程序仅仅测量这一部分,这避免了遍历整个view的层级结构来计算大小。
6.使用硬件加速
本文算作是google training的观后感。如果有不明白的地方,请自行阅读training。
- Android 自定义View (三)
- Android 自定义View (三)
- 自定义view(三)
- Android自定义View(三)
- 自定义View三
- 自定义view三
- 自定义View(三) 自定义itemCheckView
- 自定义View小示例(自定义View三)
- Android自定义View(三)继承View
- View详解之三自定义View
- Android 自定义View (三) ProgressBar
- android 自定义view(三)
- 自定义控件View(三)
- 自定义View(三)---分析JazzViewPager
- 自定义View(三)(Android群英传)
- android 自定义View 三 ---- LayoutInflater
- android自定义view(三)
- Android自定义View教程(三)
- linux文件权限查看及修改-chmod
- 配置Auto Deploy Service
- Myeclipse配置Maven
- (九)boost库之文件处理filesystem
- CFS(完全公平调度)中的虚拟运行时间(vruntime)
- 自定义view(三)
- Android Studio 调试时 INSTALL_FAILED_INSUFFICIENT_STORAGE 错误的解决方法
- android自定义控件系列教程-----touch事件的传递
- 编写高性能的JavaScript事件(1)
- spider for douban
- 向ArcSDE导入数据出现(ORA-00001: Unique contraint (SDE.GDB_OC_PKC) violated错误
- POJ 3069 Saruman's Army - 贪心
- JDK的下载
- (十)boost库之多线程