浏览 16434 次
精华帖 (4) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-05
在读Android SDK里面的samples里面游戏的时候,很多时候都看到对canvas的save()和restore()运用。 下面是个小程序,使用了这两个方面,使得旋转红色方块的时候,保证蓝色方块不受影响。
代码如下: package com.ray.test; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; public class Test extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } class MyView extends SurfaceView implements SurfaceHolder.Callback{ private SurfaceHolder mHolder; private Canvas canvas; public MyView(Context context) { super(context); mHolder = getHolder(); mHolder.addCallback(this); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { canvas = mHolder.lockCanvas(); Paint mPaint = new Paint(); mPaint.setColor(Color.BLUE); canvas.drawRect(100, 200, 200, 300, mPaint); canvas.save(); canvas.rotate(45); mPaint.setColor(Color.RED); canvas.drawRect(150, 10, 200, 60, mPaint); canvas.restore(); mHolder.unlockCanvasAndPost(canvas); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-09
@Override
public void surfaceCreated(SurfaceHolder holder) { canvas = mHolder.lockCanvas(); Paint mPaint = new Paint(); mPaint.setColor(Color.BLUE); canvas.drawRect(100, 200, 200, 300, mPaint); canvas.save(); canvas.rotate(45); mPaint.setColor(Color.RED); canvas.drawRect(150, 10, 200, 60, mPaint); canvas.restore(); mHolder.unlockCanvasAndPost(canvas); } 这段代码搂主能加上注释么? 纯代码理解有困难 |
|
返回顶楼 | |
发表时间:2010-03-15
最后修改:2010-03-15
其实楼主的代码 save 和 restore并不会影响蓝色方块的绘制。
看看我下面的代码,如果有save 和 restore,那么平移、缩放、旋转等操作只对 save到 restore之间的代码有影响。也就是说只有红色的方块是旋转的。 如图: canvas = mHolder.lockCanvas(); Paint mPaint = new Paint(); mPaint.setColor(Color.BLUE); canvas.drawRect(100, 200, 200, 300, mPaint); canvas.save(); //注释1 canvas.rotate(45); mPaint.setColor(Color.RED); canvas.drawRect(150, 10, 200, 60, mPaint); canvas.restore(); //注释2 mPaint.setColor(Color.GREEN); canvas.drawRect(200, 10, 250, 100, mPaint); mHolder.unlockCanvasAndPost(canvas); 如果上面的代码,注释1和注释2部分的代码被注释的话,那么绿色的方块一样是被旋转的。 如图: |
|
返回顶楼 | |
发表时间:2010-04-16
lishuyan0818 正解
|
|
返回顶楼 | |
发表时间:2010-06-16
多谢楼主的分享, 看了代码就清晰很多了
另外有一个问题 canvas.rotate(45); 是逆时旋转了 45 度 而matirx.setRotate(45) 是不是顺时针的 45 |
|
返回顶楼 | |
发表时间:2010-06-17
但是貌似有个问题是,旋转canvas和直接旋转对象两个比起来,旋转画布所得到的质量似乎要低一些……
|
|
返回顶楼 | |
发表时间:2010-06-18
意思就是 save() 和restore() 是用来划定操作的一个范围 这里可以不只是旋转
|
|
返回顶楼 | |
发表时间:2010-06-24
puhao7117441 写道 但是貌似有个问题是,旋转canvas和直接旋转对象两个比起来,旋转画布所得到的质量似乎要低一些……
这个可以通过设置画笔的抗锯齿来抵消, 不过有的图片即使抗锯齿了也不行 |
|
返回顶楼 | |