Android之SurfaceView(二)

来源:互联网 发布:知乎 上知网 编辑:程序博客网 时间:2024/05/19 17:26

  

  接下来讲讲使用surfView来实现动画。surfView具体的用法说明已在上一篇中讲了,这里就不仔细将了来直接看代码。


1.首先创建一个Contanier容器,用来添加各种画板代码如下:

</pre><pre name="code" class="java">import android.graphics.Canvas;import java.util.ArrayList;import java.util.List;/** * 创建一个容器 * Created by Young on 2015/5/5. */public class Contanier {    private List<Contanier> children=null;//用于保存子容器    private float x,y;    public float getX() {        return x;    }    public void setX(float x) {        this.x = x;    }    public float getY() {        return y;    }    public void setY(float y) {        this.y = y;    }    public  Contanier(){        children=new ArrayList<Contanier>();    }    /**     * 子容器     * @param canvas     */    public void  childrenView(Canvas canvas) {}    /**     * 添加指定的子容器     * @param child     */    public void  addChildrenView(Contanier child){        children.add(child);    }    /**     * 移除指定的子容器     * @param child     */    public  void removeChildrenView(Contanier child){        children.remove(child);    }    public void draw(Canvas canvas){        canvas.save();//保存canvas状态        canvas.translate(getX(),getY());        childrenView(canvas);        for (Contanier c:children){            c.draw(canvas);        }        canvas.restore();//恢复canvas之前保存的状态,防止保存后对canvas执行的操作对后续的绘制的影响    }}

2.创建一个GameView继承与SurfView用来实现动画画图,具体代码如下;
import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.SurfaceHolder;import android.view.SurfaceView;/** * Created by Young on 2015/5/5. */public class GameView extends SurfaceView implements SurfaceHolder.Callback {    private Contanier contanier;    private Rect rect;    private Circle circle;    private SurfaceHolder holder;    private MyThread myThread;    public GameView(Context context) {        super(context);        holder=this.getHolder();        holder.addCallback(this);        contanier=new Contanier();        rect= new Rect();        circle=new Circle();        rect.addChildrenView(circle);//将圆放入一个矩形中        contanier.addChildrenView(rect);//将矩形放入一个容器中        myThread=new MyThread(holder);//创建一个绘图线程    }    /**     * 创建一个线程用于实现动画     */    class MyThread extends Thread {        private SurfaceHolder holder;        public boolean isRun;        public MyThread(SurfaceHolder holder) {            this.holder = holder;            isRun = true;        }        @Override        public void run() {            int count = 0;            while (isRun) {                Canvas c = null;                try {                    synchronized (holder) {                        c = holder.lockCanvas();//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。                        c.drawColor(Color.WHITE);//设置画布背景颜色                        contanier.draw(c);                        Thread.sleep(100);//使线程睡眠1s                    }                } catch (InterruptedException e) {                    e.printStackTrace();                } finally {                    if (c != null) {                        holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。                    }                }            }        }    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        myThread.isRun=true;        myThread.start();//开启线程    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        myThread.isRun=false;    }    /**     * 绘制一个红色的矩形     */    class Rect extends Contanier{        private Paint paint=null;        public Rect(){            paint=new Paint();            paint.setColor(Color.RED);//画笔颜色        }        @Override        public void childrenView(Canvas canvas) {            super.childrenView(canvas);            canvas.drawRect(0, 0, 100, 100, paint);            this.setY(this.getY() + 1);//每次像素加一            this.setX(this.getX()+1);        }    }    /**     * 绘制一个蓝色的圆     */    class Circle extends Contanier{        private Paint paint=null;        public Circle(){            paint=new Paint();            paint.setColor(Color.BLUE);        }        @Override        public void childrenView(Canvas canvas) {            super.childrenView(canvas);            canvas.drawCircle(50,50,50,paint);        }    }}

3.最后一步就是把所画好的SurfView添加到页面上去,具体代码如下;
mainActivity.java
public class MainActivity extends ActionBarActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //setContentView(new MyView(this));        setContentView(new GameView(this));       // MyView myView=new MyView(this);    }}

doem下载:http://download.csdn.net/detail/agonie201218/8665291

0 0
原创粉丝点击