android自定义View2--SurfaceView

本文介绍了Android中自定义View的第二种方式——使用SurfaceView实现动画。相较于普通View,SurfaceView在处理动态图形时更优,但存在一定的缺陷,如缺少双缓存等。文章通过实例讲解如何继承SurfaceView,并结合SurfaceHolder进行图形绘制,强调了SurfaceHolder在获取Canvas对象中的作用,同时提到了canvas和paint类的一些主要方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值