SurfaceView使用总结

一,简单使用
可见以下链接,比较详细


二,刷新View
比如点击view时需要它重画
  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. switch (event.getAction()) {
  4. case MotionEvent.ACTION_DOWN:
  5. case MotionEvent.ACTION_MOVE:
  6. mXCross = event.getX();
  7. mCrossEnabled = true;
  8. // 重绘
  9. if(myThread!=null && myThread.myHandler != null) {
  10. myThread.myHandler.sendEmptyMessage(0);
  11. }
  12. // Log.e("on mXCross,mYCross==",mXCross + "," + mYCross);
  13. break;
  14. case MotionEvent.ACTION_UP :
  15. mXCross = -1f;
  16. mCrossEnabled = false;
  17. // 重绘
  18. if(myThread!=null && myThread.myHandler != null) {
  19. myThread.myHandler.sendEmptyMessage(0);
  20. }
  21. break;
  22. }
  23. return true;
  24. }

在子线程中绘制View,需要线程绑定一个Looper,需要handler
  1. // 线程内部类
  2. class MyThread extends Thread {
  3. private SurfaceHolder holder;
  4. private StockDrawWave drawWave;
  5. MyHandler myHandler;// 用户子线程绘制UI
  6. public MyThread(SurfaceHolder holder, StockDrawWave drawWave) {
  7. this.holder = holder;
  8. this.drawWave = drawWave;
  9. }
  10. class MyHandler extends Handler {
  11. @Override
  12. public void handleMessage(Message msg) {
  13. drawTimeChar();// 以后刷新时都直接执行绘制方法
  14. }
  15. }
  1. @Override
  2. public void run() {// 此处为初始化,第一次绘制时运行
  3. Looper.prepare();// Looper与Thread绑定
  4. myHandler = new MyHandler();// 与Looper绑定
  5. drawTimeChar();
  6. Looper.loop();// 处理消息
  7. }

View关闭时,终止线程并让其被回收
  1. @Override
  2. public void surfaceDestroyed(SurfaceHolder holder) {
  3. if (myThread != null) {
  4. myThread.isRun = false;
  5. myThread.myHandler.getLooper().quit();// 终止looper循环,让线程可以被回收
  6. myThread = null;
  7. }
  8. }






posted on 2015-10-27 18:46  陈诚之  阅读(344)  评论(0编辑  收藏  举报

导航