Android之SurfaceView(二)

接下来讲讲使用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;}@Overridepublic 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);//结束锁定画图,,并提交改变。}}}}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {myThread.isRun=true;myThread.start();//开启线程}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {myThread.isRun=false;}/*** 绘制一个红色的矩形*/class Rect extends Contanier{private Paint paint=null;public Rect(){paint=new Paint();paint.setColor(Color.RED);//画笔颜色}@Overridepublic 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);}@Overridepublic void childrenView(Canvas canvas) {super.childrenView(canvas);canvas.drawCircle(50,50,50,paint);}}}3.最后一步就是把所画好的SurfView添加到页面上去,具体代码如下;mainActivity.javapublic class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(new MyView(this));setContentView(new GameView(this));// MyView myView=new MyView(this);}}doem下载:

走过的路成为背后的风景,不能回头不能停留,若此刻停留,

Android之SurfaceView(二)

相关文章:

你感兴趣的文章:

标签云: