android自定义View的第二种方式 写一个类继承SurfaceView实现动画。
使用自定义实现动画的缺陷:
1:view缺少双缓存;
2:当程序需要更新view图形时,程序必须重新重绘整张图片;
因此我们更推荐使用第二种surfaceView 虽然比较麻烦;
下面通过例子讲述继承surfaceview ;
*SurfaceView一般 与SurfaceHolder结合使用,
*SurfaceHolder用于向与之有关的SurfaceView上绘图;用getHolder
可以直接获 得到当前的SurfaceHolder
*holder=getHolder();
*SurfaceHolder的方法用于获取Canvas对象;
demo1
/** * * *SurfaceView一般 与SurfaceHolder结合使用, *SurfaceHolder用于向与之有关的SurfaceView上绘图;用getHolder 可以直接获得到当前的SurfaceHolder *holder=getHolder(); *SurfaceHolder的方法用于获取Canvas对象; * * @author Administrator * */ public class SurTest extends SurfaceView implements Callback { //获取画布对象 SurfaceHolder holder; //画布 Canvas can; //画笔 Paint p; //定时器用于更新 Timer time; int x=0; int y=0; int z=50,s=50; //用来保存当前SurfaceView宽和高 int w,h; public SurTest(Context context) { super(context); // TODO Auto-generated constructor stub holder=getHolder(); holder.addCallback(this); p=new Paint(); time=new Timer(); time.schedule(new TimerTask(){ @Override public void run() { // TODO Auto-generated method stub x+=10; y+=10; z+=10; s+=10; //获取当前的画布 can=holder.lockCanvas(); p.setColor(Color.WHITE); can.drawRect(0, 0, w, h, p); p.setColor(Color.BLUE); can.drawRect(x, y, z, s, p); can.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.s), x+3, y+4, p); // holder.unlockCanvasAndPost(can); } }, 1000, 100); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub w=width; h=height; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } /** * 当点击SurfaceView界面的时候 */ @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if(event.getAction()==MotionEvent.ACTION_DOWN) { int cx=(int) event.getX(); int cy=(int) event.getY(); //控制SurfaceView在一定区域之内 Canvas can1=holder.lockCanvas(new Rect(cx-50,cy-50,cx+50,cy+50)); //保存现在的状态,之后可以恢复 can1.save(); //旋转画布30度 can1.rotate(30, cx, cy); p.setColor(Color.GREEN); //画出以旋转之后的基点为准的图形 can1.drawRect(cx-40, cy-40, cx, cy, p); //恢复之后的保持状态 can1.restore(); p.setColor(Color.YELLOW); //画出恢复之前基点状态的图形 can1.drawRect(cx, cy, cx+40, cy+40, p); //绘制完成 释放画布 提交修改 holder.unlockCanvasAndPost(can1); } return false; }
点击界面可以查看效果
canvas类的主要方法
paint的主要方法