zoukankan      html  css  js  c++  java
  • SurfaceView的绘图机制

    public class SurfaceViewTest extends Activity {
    
        //SurfaceHolder负责维护SurfaceView上绘制的内容
        private SurfaceHolder holder;
        private Paint paint;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.surface);
            paint=new Paint();
            SurfaceView surface=(SurfaceView) findViewById(R.id.surface);
            //初始化SurfaceView对象
            holder=surface.getHolder();
            holder.addCallback(new Callback() {
                @Override
                public void surfaceDestroyed(SurfaceHolder arg0) {
                    // TODO Auto-generated method stub
                }
                @Override
                public void surfaceCreated(SurfaceHolder arg0) {
                    // TODO Auto-generated method stub
                    //锁定整个SurfaceView
                    Canvas canvas=holder.lockCanvas();
                    //绘制背景
                    Bitmap back=BitmapFactory.decodeResource(SurfaceViewTest.this.getResources(), 
                            R.drawable.ic_launcher);
                    canvas.drawBitmap(back, 0,0, null);
                    //绘制完成,释放画布,提交修改
                    holder.unlockCanvasAndPost(canvas);
                    //重新锁一次,“持久化”上次所绘制的内容
                    holder.lockCanvas(new Rect(0, 0, 0, 0));
                    holder.unlockCanvasAndPost(canvas);
                }
                @Override
                public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
                    // TODO Auto-generated method stub
                }
            });
            //为SurfaceView绑定监听事件
            surface.setOnTouchListener(new OnTouchListener() {
                
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    // TODO Auto-generated method stub
                    //按下的事件
                    if(arg1.getAction()==MotionEvent.ACTION_DOWN){
                        int cx=(int) arg1.getX();
                        int cy=(int) arg1.getY();
                        //锁定SurfaceView的局部区域,只更新局部
                        Canvas canvas=holder.lockCanvas(new Rect(cx-50, cy-50, cx+50, cy+50));
                        //保存当前的状态
                        canvas.save();
                        canvas.rotate(30, cx, cy);
                        paint.setColor(Color.GREEN);
                        canvas.drawRect(cx-40, cy-40, cx, cy, paint);
                        canvas.restore();
                        paint.setColor(Color.RED);
                        canvas.drawRect(cx, cy, cx+40, cy+40, paint);
                        holder.unlockCanvasAndPost(canvas);
                    }
                    return false;
                }
            });
        }
    }

        SurfaceView一般会与SurfaceHolder结合使用,SurfaceHolder用于向与之关联的SurfaceView上绘图,调用SurfaceView的getHolder()方法即可获取SurfaceView关联的SurfaceHolder。

      SurfaceHolder提供了如下方法来获取Canvas对象。

       Canvas lockCanvas():锁定SurfaceView对象,获取Surface上的Canvas。

       Canvas lockCanvas(Rect dirty):锁定SurfaceView上Rect划分的区域,获取该Surface上的Canvas。

       unlockCanvasAndPost(canva);

      需要指出的是,当调用SurfaceHolder的 unlockCanvasAndPost方法之后,该方法之前绘制的图形还处于缓冲之中,下一次lockCanvas()方法锁定的区域可能会“遮挡”它。

      

       

      

  • 相关阅读:
    转发:原本优秀的我们是怎样滑向平庸的
    阿里巴巴C++实习生相关招聘一则
    [置顶] 我希望在20岁时就知道的26条时间管理技巧
    提示用户进行版本更新并且发布通知监控版本下载情况
    树状数组求正序数与逆序数hdu Minimum Inversion Number
    通过js 实现简单验证码的 刷新 看不清 换一张
    配置 CACTI 监控 MySQL 数据库状态
    Win7下ADB不能识别设备的可能原因
    Java 开源博客——B3log Solo 0.6.0 正式版发布了!
    MyEclipse下Import没有Maven的处理办法
  • 原文地址:https://www.cnblogs.com/lk119/p/3256137.html
Copyright © 2011-2022 走看看