Android SurfaceView 学习笔记(二)
来源:互联网 发布:java excel预览 编辑:程序博客网 时间:2024/06/10 20:30
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);这个方法设置控件大小.
Activity 中 的onCreate(Bundle)
SurfaceView 子类
这是由于 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>
- 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);
- }
- }
- }
- }
结果如图
![](http://hi.csdn.net/attachment/201112/15/0_1323938601uoGp.gif)
0 0
- Android SurfaceView 学习笔记(二)
- Android SurfaceView 学习笔记(二)
- Android SurfaceView 学习笔记
- Android SurfaceView学习笔记
- Android SurfaceView 的学习(二)
- android学习笔记 SurfaceView模板
- Android之SurfaceView(二)
- Android学习笔记(一)——surfaceview、GLSurfaceview
- Android Camera之SurfaceView学习笔记
- Android之SurfaceView简介(二)
- Android SurfaceView(二、实现原理)
- Android SurfaceView 详解(二)
- Android SurfaceView 详解(二)
- Android SurfaceView 笔记
- android笔记3(surfaceview)
- Android SurfaceView使用 笔记
- Android 笔记 surfaceView textureView
- android群英传笔记 surfaceView
- Objective-C实现一个基于数组下标[index]和字典[@"key"]的访问模式
- Ubuntu14.04 安装Eclipse
- 【CSS3】文字与字体--慕课网【学习总结】
- phpStudy设置301重定向
- PHP Apache Mysql的配置搭建及多站点配置
- Android SurfaceView 学习笔记(二)
- Knowledge-Based Textual Inference via Parse-Tree Transformations 翻译
- ubuntu 16.04 LTS 系统中配置svn服务器
- 嵌入式LAB 1:启动
- 设计模式——迭代模式
- jquery easyui combotree
- 74. Search a 2D Matrix
- Picasso源码分析(五):into方法追本溯源和责任链模式创建BitmapHunter
- FFT核Modelsim仿真