zoukankan      html  css  js  c++  java
  • [转]Android中在SurfaceView上高效绘图

    本文转自:http://hi.baidu.com/fqlibra/blog/item/0216d603876345c07b89478c.html

    Android的大多数控件都是继承自View的,因此在自定义控件时一般也是继承View类,但是对于高效的,游戏级别的绘图,或者是播放器等要求比较高的地方,普通的View类就

    有点吃不开了,这个时候就要用到SurfaceView类。
    因为比较高级,所以就该装B,单纯一个继承自SurfaceView类是不行的,必须实现一个SurfaceHolder.Callback接口来指明SurfaceView创建、改变、删除时的回调方法,并且

    在SurfaceView中通过一个SurfaceHolder对象来控制SurfaceView。
    如果将该SurfaceView作为某个Activity的全屏View,则直接调用setContentView(new MyView());就好了;但若是作为屏幕View的一部份,就应该修改对应的layout XML文件

    了,添加类似的布局代码:
        <com.example.fq.MyView
        android:id="@+id/sv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
    其中com.example.fq.MyView为对应自定义类的全名。
    由于默认的XML文件解析方法是调用View的View(Context , AttributeSet )构造函数构造View,因此你的自定义SurfaceView中也应该有一个参数为(Context , AttributeSet )

    的构造函数,并且在构造函数中执行父类的对应函数super( Context , AttributeSet )。

    在绘图时,必须首先用Canvas c=holder.lockCanvas();锁定并获得画布,随后进行绘制,再调用holder.unlockCanvasAndPost(c);将绘制内容进行呈现

    下面是个例子:
    MyView.java:
    public class MyView extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder holder=null; //控制对象
    private Vector<Float> xs=new Vector<Float>();
    private Vector<Float> ys=new Vector<Float>();

    public MyView(Context context,AttributeSet attr) {
       super(context,attr);
       // TODO Auto-generated constructor stub
       holder=getHolder();
       holder.addCallback(this);
    }


    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
       // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
       // TODO Auto-generated method stub
       new Thread(new MyLoop()).start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
       // TODO Auto-generated method stub

    }

    public void doDraw(Canvas canvas) {
       // TODO Auto-generated method stub
       super.onDraw(canvas);
       canvas.drawColor(Color.WHITE);//这里是绘制背景
       Paint p=new Paint(); //笔触
       p.setAntiAlias(true); //反锯齿
       p.setColor(Color.BLACK);
       p.setStyle(Style.STROKE);
       for(int i=0;i<xs.size();i++)
        canvas.drawCircle(xs.elementAt(i),ys.elementAt(i),10, p);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
       // TODO Auto-generated method stub
       if(event.getAction()==MotionEvent.ACTION_DOWN){
        xs.add(event.getX());
        ys.add(event.getY());
       }
       return true;
    }

    class MyLoop implements Runnable{
    //熟悉游戏编程的应该很面熟吧,主循环
       @Override
       public void run() {
        // TODO Auto-generated method stub
        while(true){
         try{
          Canvas c=holder.lockCanvas();
          doDraw(c);
          holder.unlockCanvasAndPost(c);
          Thread.sleep(20);
         }catch(Exception e){
         
         }
        }
       }
      
    }

    }

    Main.java
    public class Main extends Activity {
    private MyView sv=null;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            sv=(MyView)findViewById(R.id.sv);
        }
    }

    main.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"
        >
        <com.example.fq.MyView
        android:id="@+id/sv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
    </LinearLayout>



  • 相关阅读:
    Number原生类型的扩展
    复杂参数的基本使用方式
    使用Number原生类型
    Function原生类型
    面向对象类型系统
    Error原生类型的扩展
    Date原生类型的扩展
    flex学习网站大全(转)
    如何调试javaScript
    使用JavaScriptConverter实现返回DataTable对象
  • 原文地址:https://www.cnblogs.com/freeliver54/p/2327844.html
Copyright © 2011-2022 走看看