package com.example.clipdrawabledemo;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
/*
* 使用SurfaceView实现动画
* 自定义view来进行绘图存在如下缺陷:
* 1、View缺乏双缓冲机制
* 2、当程序需要更新View上的图像是,程序必须重绘View上显示的整张图片
* 3、新线程无法直接更新View组件
* 由于View存在上述缺陷,所以通过自定义View来实现绘图,尤其是游戏中的绘图是性能并不好。
* Android提供了一个SurfaceView来代替View,在实现游戏绘图方面,SurfaceView比View更加
* 出色,因此一般推荐使用SurfaceView。
* SurfaceView一般会与SurfaceHolder结合使用,SurfaceHolder用于向与之关联的SurfaceView
* 上绘图,调用SurfaceView的getHolder()即可获取SurfaceView关联的SurfaceHolder
* SurfaceHolder提供了如下方法来获取Canvas对象:
* Canvas LockCanvas():锁定整个SurfaceView对象,获取改Surface上的Canvas
* Canvas lockCanvas(Rect dirty):锁定SurfaceView上的Rect划分的区域,获取改Surface上的Canvas
* 当对同一个SurfaceView调用上面两个方法是,两个所返回的是同一个Canvas对象。
* 当当程序调用第二个方法获取指定区域的Canvas是,SurfaceView只能对Rect所“圈”出来的区域
* 进行更新,通过这种方式可以提高画面的更新速度
* 当通过lockCanvas()获取制定了SurfaceView上的Canvas之后,接下来程序就可以调用Canvas进行绘图了
* Canvas绘图完成后通过如下方法释放绘图、提交所绘制的图形:
* unlockCanvasAndPost(canvas);
* 需要指出的是当调用SurfaceHolder的unlockCanvasAndPost方法之后,该方法之前所绘制的图形还处于
* 缓冲之中,下一次lockCanvas()方法锁定的区域可能会“遮挡”它。
*
*
*/
public class SurfaceViewTest extends Activity {
private SurfaceHolder holder;
private Paint paint;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//没标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
setContentView(R.layout.surfaceview_layout);
paint=new Paint();
//获取SurfaceView对象
SurfaceView surface=(SurfaceView) findViewById(R.id.surfaceView1);
//获取SurfaceView对象的SurfaceHolder对象
holder=surface.getHolder();
//SurfaceHolder的回调方法
holder.addCallback(new Callback(){
//当SurfaceHolder的格式或大小发生改变的时候调用
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
//当SurfaceHolder创建的时候调用
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
//绘制整个SurfaceView
Canvas canvas=holder.lockCanvas();
Bitmap back=BitmapFactory.decodeResource(SurfaceViewTest.this.getResources()
,R.drawable.fat_03);
canvas.drawBitmap(back,30,30,null);
//绘制完成,释放画布提交修改
holder.unlockCanvasAndPost(canvas);
/*重新锁一次,“持久化”上次所绘制的内容,因为unlockCanvasAndPost之后上一次
* 绘制的图形还在缓冲之中,以免被下次绘制图形遮挡
*/
holder.lockCanvas(new Rect(0,0,0,0));
holder.unlockCanvasAndPost(canvas);
}
//当该Surface将要被销毁时回调
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
});
surface.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, 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,只更新局部内容
Canvas canvas=holder.lockCanvas(new Rect(cx-50,cy-50,cx+50,cy+50));
//保存canvas的当前状态
canvas.save();
//旋转画布
canvas.rotate(30,cx,cy);
paint.setColor(Color.rgb(255,0,0));
paint.setStyle(Paint.Style.FILL);
//绘制红色方块
canvas.drawRect(cx-40,cy-40,cx+40,cy+40, paint);
//恢复Canvas之前的保存状态
canvas.restore();
//绘制绿色方框
paint.setColor(Color.rgb(0,255,0));
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
canvas.drawRect(cx,cy,cx+30,cy+30, paint);
//完成绘制提交修改
holder.unlockCanvasAndPost(canvas);
}
return false;
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
今天的文章SurfaceView之SurfaceHolder分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/33667.html