SurfaceView简介

28 篇文章 0 订阅
11 篇文章 0 订阅
SurfaceView 是一个继承了View但是由于一般的View有这很大区别的类. 这是由于 SurfaceView 的绘制方法和原来的View不同.在 View 中系统不允许主线程外的线程控制 UI .但是 SurfaceView 却可以 .下面是我总结的几个要点:

  1. 首先需要实现 View 的构造方法.( 如果 需要在XML 文件中布局需要实现public S(Context context, AttributeSet attrs) 这个构造方法 )

  2. 由于需要对SurfaceView 进行监控所以需要实现 SurfaceHolder.Callback 这个接口( 可以用内部类或者方法实现.) 这个接口需要实现三个方法:

   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} //大小改变的时候被调用到.
   public void surfaceCreated(SurfaceHolder holder) {} // 创建的时候被调用到
   public void surfaceDestroyed(SurfaceHolder holder) {} //销毁的时候被调用

  3.在SurfaceView 中屏幕接触处理和 布局处理和View一样.

  4. 使用绘制的时候和 View 完全不一样.他是使用 SufaceHodler 的方法
   public canvas holder.lockCanvas();
  public void unlockCanvasAndPost(canvas);

  第一个方法可以调用出一个Canvas 画布.在上面绘制所需的画面.然后调用第二个方法.这样就可以在屏幕上面绘制出来的.
  View中的 invalidate()方法需要在主线程中调用(postInvalidate()不同).但是 SurfaceView不需要.SurfaceView绘制效率比View高.

  5.SurfaceView中如果需要请求重新布局同样使用 requestLayout();

  6. 和View一样重要的一些方法:

  onMeasure(int ,int); 是使用 View 前需要调用的方法. 通知View进行自身尺寸测量.如果自己重写的话测量完自身大小注意需要调用setMeasuredDimension(int, int);这个方法设置控件大小.
  onLayout(boolean,int,int,int,int); 这个方法使父控件具体分配给当前View的具体位置的方法.

Java代码:
  1. < ?xml version="1.0" encoding="utf-8"?>
  2. < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. < EditText
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/hello"
  11. android:focusable = "true"
  12. />
  13. < com.en.demo.SVD
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. />
  17. < /LinearLayout>
复制代码

       SurfaceView 子类 SVD:

Java代码:
  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.util.AttributeSet;
  4. import android.view.SurfaceHolder;
  5. import android.view.SurfaceView;

  6. public class SVD extends SurfaceView implements SurfaceHolder.Callback, Runnable{
  7. SurfaceHolder holder;
  8. public SVD(Context context, AttributeSet attrs) {
  9. super(context, attrs);
  10. System.out.println("init()");
  11. holder = getHolder();
  12. holder.addCallback(this);
  13. }

  14. public void draw(){
  15. System.out.println(" draw()");
  16. Canvas canvas = holder.lockCanvas();
  17. draw(canvas);
  18. holder.unlockCanvasAndPost(canvas);
  19. }

  20. @Override
  21. public void draw(Canvas canvas) {
  22. canvas.drawColor(0xff7f7f7f + (run < < 3));
  23. }

  24. @Override
  25. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  26. super.setMeasuredDimension(130, 100);
  27. }

  28. @Override
  29. public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
  30. System.out.println("width:"+width+" height:"+height);
  31. }

  32. @Override
  33. public void surfaceCreated(SurfaceHolder holder) {
  34. System.out.println(" create ");
  35. new Thread(this).start();
  36. }

  37. @Override
  38. public void surfaceDestroyed(SurfaceHolder holder) {
  39. this.holder = null;
  40. }

  41. int run = 10;
  42. @Override
  43. public void run() {
  44. // TODO Auto-generated method stub
  45. try{
  46. while( run-- > 0){
  47. draw();
  48. Thread.sleep(1000);
  49. }
  50. }catch(Exception e){
  51. e.printStackTrace();
  52. }
  53. }
  54. }

  55. //Activity 中 的onCreate(Bundle)
  56. public void onCreate(Bundle savedInstanceState) {
  57. super.onCreate(savedInstanceState);
  58. setContentView(R.layout.main);
  59. }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值