现在的位置: 首页 > 综合 > 正文

android自定义View2–SurfaceView

2018年05月27日 ⁄ 综合 ⁄ 共 2124字 ⁄ 字号 评论关闭

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




抱歉!评论已关闭.