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的主要方法