Android SurfaceView 学习笔记(二)

来源:互联网 发布:数据结构算法与应用pdf 编辑:程序博客网 时间:2024/05/07 00:59
      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的具体位置的方法.

下面上代码,XML代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><TextView     android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:text="@string/hello"    /><com.demo.test.CustomView    android:id="@+id/customView1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"></com.demo.test.CustomView></LinearLayout>
Activity 中 的onCreate(Bundle)

public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);    }

SurfaceView 子类
public class CustomView extends SurfaceView implements SurfaceHolder.Callback {    private SurfaceHolder holder;    private MyThread thread;    private boolean isrun;    public  Bitmap bitmap;    public  Matrix matrix= new Matrix(); ;    public  Paint mPaint = new Paint();    public  InputStream is;        public CustomView(Context context, AttributeSet attrs){       super(context, attrs);       holder = getHolder();       holder.addCallback(this);       isrun = false;    }    @Override    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {       // TODO Auto-generated method stub    }    @Override    public void surfaceCreated(SurfaceHolder arg0) {       // TODO Auto-generated method stub    is = getResources().openRawResource(R.drawable.view);    bitmap = BitmapFactory.decodeStream(is);    isrun = true;    thread = new MyThread();    thread.start();    }    @Override    public void surfaceDestroyed(SurfaceHolder arg0) {       // TODO Auto-generated method stub       isrun = false;    }    class MyThread extends Thread    {       public void run()       {           SurfaceHolder runholder = holder;           if(isrun == true)           {              Canvas canvas = runholder.lockCanvas();              canvas.drawBitmap(bitmap,matrix,mPaint);              runholder.unlockCanvasAndPost(canvas);           }       }    }}



结果如图


这行是分割线————————————————————————————————————————

下面是没有XML布局的写法

Activity 中 的onCreate(Bundle)

public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(new CustomView(this, null));    }

SurfaceView 子类 同上

———————————————————————————————————————————————

结果如图



原创粉丝点击