canvas.save()和canvas.restore()值得一看的一个问题

Potter
博客专家认证
2011-08-06 11:25:50

Activity

public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MySurfaceView(this));
}
}

SurfaceView类:
public class MySurfaceView extends SurfaceView implements Callback{
public SurfaceHolder holder;
public Canvas canvas;
public Bitmap image[]=null;
public int temp=0;
public MySurfaceView(Context context) {
super(context);
Bitmap tempImage=BitmapFactory.decodeResource(context.getResources(), R.drawable.piranha_plant);
image=new Bitmap[4];
image[0]=Bitmap.createBitmap(tempImage, 0, 0, tempImage.getWidth()/4, tempImage.getHeight());
image[1]=Bitmap.createBitmap(tempImage, tempImage.getWidth()/4, 0, tempImage.getWidth()/4, tempImage.getHeight());
image[2]=Bitmap.createBitmap(tempImage, 2*tempImage.getWidth()/4, 0, tempImage.getWidth()/4, tempImage.getHeight());
image[3]=Bitmap.createBitmap(tempImage, 3*tempImage.getWidth()/4, 0, tempImage.getWidth()/4, tempImage.getHeight());
this.setFocusable(true);//获得焦点
this.setFocusableInTouchMode(true);//获得焦点的触屏焦点也可用
requestFocus();//获得焦点请求
holder=getHolder();
holder.addCallback(this);
}

public void onDraw(){
canvas=holder.lockCanvas();
try {
canvas.save();
canvas.drawBitmap(image[temp], temp*20, 0, new Paint());
canvas.restore();
} catch (Exception e) {
e.printStackTrace();
}finally{
holder.unlockCanvasAndPost(canvas);
}
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
onDraw();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
if(temp<4){
temp++;
onDraw();
}
}else if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){
temp--;
onDraw();
}
return super.onKeyDown(keyCode, event);
}

}
大家可以随便弄一张连续四帧的图片,名字搞好就可以了。想过绝对会出乎你的意料
所以由此来讨论canvas.save()和canvas.retore()到底是如何保存、如何恢复,什么时候保存、什么时候恢复..
希望大家多发表意见???


...全文
483 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingshaofengbinbin 2011-08-06
  • 打赏
  • 举报
回复
好好利用开源的好处啊,不要乱猜!!
dingshaofengbinbin 2011-08-06
  • 打赏
  • 举报
回复
看源码是最直接的!!!
Potter 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fontlose 的回复:]
这里有4个小图
第一次 显示frontbuffer黑的 在backbuffer 上画图1
第二次 显示backbuffer 即图1 在frontbuffer 上画图2
第三次 显示frontbuffer即图2 在backbuffer 上画图3
第四次 显示backbuffer 即图13 在frontbuffer 上画图4
第五次 显示frontbuffer即图24 在……
[/Quote]
非常感谢!
fontlose 2011-08-06
  • 打赏
  • 举报
回复
这里有4个小图
第一次 显示frontbuffer黑的 在backbuffer 上画图1
第二次 显示backbuffer 即图1 在frontbuffer 上画图2
第三次 显示frontbuffer即图2 在backbuffer 上画图3
第四次 显示backbuffer 即图13 在frontbuffer 上画图4
第五次 显示frontbuffer即图24 在backbuffer 上画图1
。。。。。。。

所以你看到的是图13 和图24交替显示的
每次holder.unlockCanvasAndPost(canvas);会交替显示一次。说的不详细具体网上搜索下
http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&client=firefox-a&hs=FBw&rls=org.mozilla%3Azh-CN%3Aofficial&q=SurfaceView+buffer&btnG=Google+%E6%90%9C%E7%B4%A2&oq=SurfaceView+buffer&aq=f&aqi=&aql=&gs_sm=s&gs_upl=1867l1867l0l2557l1l1l0l0l0l0l0l0ll0l0



Potter 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fontlose 的回复:]
你这个效果是SurfaceView的frontbuffer和backbuffer在作怪
[/Quote]

能具体解释解释吗?。。。。感谢了
fontlose 2011-08-06
  • 打赏
  • 举报
回复
你这个效果是SurfaceView的frontbuffer和backbuffer在作怪
fontlose 2011-08-06
  • 打赏
  • 举报
回复
这里canvas.save()和canvas.retore()没起作用阿
Potter 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 drsmart 的回复:]
有现成工程吗,我帮你调下,贴的代码猜的麻烦,哈哈
[/Quote]
随便给个邮箱给我吧,我发你邮箱里面
Potter 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 drsmart 的回复:]
有现成工程吗,我帮你调下,贴的代码猜的麻烦,哈哈
[/Quote]

有,用qq邮箱发给你吧!
DrSmart 2011-08-06
  • 打赏
  • 举报
回复
有现成工程吗,我帮你调下,贴的代码猜的麻烦,哈哈
Potter 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dingshaofengbinbin 的回复:]
好好利用开源的好处啊,不要乱猜!!
[/Quote]

源码里面有没有东西啊

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧