zoukankan      html  css  js  c++  java
  • 可视区域应用-android游戏开发

    主要方法:
                    //----设置矩形可视区域
                    canvas.save();
                    canvas.clipRect(20,20,50,50);
                    canvas.drawBitmap(bmp, 0, 0, paint);
                    canvas.restore();
                    //----利用Path设置可视区域
                    canvas.save();
                    Path path=new Path();
                    path.addCircle(100+30, 100+30, 30, Direction.CCW);
                    canvas.clipPath(path);
                    canvas.drawBitmap(bmp, 100, 100, paint);
                    canvas.restore();
                    //----利用Region设置可视区域
                    canvas.save();
                    Region region = new Region();
                    region.op(new Rect(20,20+300,100,100+300), Region.Op.XOR);
                    region.op(new Rect(40,20+300,80,150+300), Region.Op.XOR);
                    canvas.clipRegion(region);
                    canvas.drawBitmap(bmp, 0, 300, paint);
                    canvas.restore();

    案例运行结果:

    案例源码:

      1 package caicai.animation;
      2 
      3 import android.content.Context;
      4 import android.graphics.Bitmap;
      5 import android.graphics.BitmapFactory;
      6 import android.graphics.Canvas;
      7 import android.graphics.Color;
      8 import android.graphics.Matrix;
      9 import android.graphics.Paint;
     10 import android.graphics.PaintFlagsDrawFilter;
     11 import android.graphics.Path;
     12 import android.graphics.Path.Direction;
     13 import android.graphics.Rect;
     14 import android.graphics.RectF;
     15 import android.graphics.Region;
     16 import android.util.Log;
     17 import android.view.MotionEvent;
     18 import android.view.SurfaceHolder;
     19 import android.view.SurfaceHolder.Callback;
     20 import android.view.SurfaceView;
     21 
     22 public class clipView extends SurfaceView implements Callback, Runnable {
     23     private Paint paint;// 画布
     24     private SurfaceHolder sfh; // 用于控制SurfaceView
     25     private Canvas canvas;// 画布
     26     private boolean flag;// 关闭线程标志
     27     private Thread th;// 新建线程
     28     private Bitmap bmp;// 位图
     29 
     30     // 设置画布绘图无锯齿
     31     private PaintFlagsDrawFilter pfd = new PaintFlagsDrawFilter(0,
     32             Paint.ANTI_ALIAS_FLAG);
     33 
     34     public clipView(Context context) {
     35         super(context);
     36         sfh = this.getHolder();// 实例SurfaceHolder
     37         sfh.addCallback(this);// 为SurfaceView添加状态监听
     38         paint = new Paint();// 实例一个画笔
     39         paint.setColor(Color.WHITE);// 设置画笔颜色为白色
     40         setFocusable(true);// 设置焦点
     41         bmp = BitmapFactory.decodeResource(getResources(), R.drawable.tanke);
     42     }
     43 
     44     @Override
     45     public void surfaceCreated(SurfaceHolder holder) {
     46         flag = true;
     47         // 实例线程
     48         th = new Thread(this);
     49         // 启动线程
     50         th.start();
     51     }
     52 
     53     public void mydraw() {
     54         try {
     55             canvas = sfh.lockCanvas();// 锁定画布
     56             if (canvas != null) {
     57                 canvas.drawColor(Color.BLACK);
     58                 //----设置矩形可视区域
     59                 canvas.save();
     60                 canvas.clipRect(20,20,50,50);
     61                 canvas.drawBitmap(bmp, 0, 0, paint);
     62                 canvas.restore();
     63                 //----利用Path设置可视区域
     64                 canvas.save();
     65                 Path path=new Path();
     66                 path.addCircle(100+30, 100+30, 30, Direction.CCW);
     67                 canvas.clipPath(path);
     68                 canvas.drawBitmap(bmp, 100, 100, paint);
     69                 canvas.restore();
     70                 //----利用Region设置可视区域
     71                 canvas.save();
     72                 Region region = new Region();
     73                 region.op(new Rect(20,20+300,100,100+300), Region.Op.XOR);
     74                 region.op(new Rect(40,20+300,80,150+300), Region.Op.XOR);
     75                 canvas.clipRegion(region);
     76                 canvas.drawBitmap(bmp, 0, 300, paint);
     77                 canvas.restore();
     78                 canvas.drawBitmap(bmp, 200, 300, paint);
     79             } else {
     80                 Log.i("tt", "获取不到画布");// 释放画布
     81             }
     82         } catch (Exception e) {
     83 
     84         } finally {
     85             if (canvas != null)
     86                 sfh.unlockCanvasAndPost(canvas);
     87         }
     88     }
     89 
     90     /**
     91      * SurfaceView视图状态发生改变,响应此函数
     92      */
     93     @Override
     94     public void surfaceChanged(SurfaceHolder holder, int format, int width,
     95             int height) {
     96         // TODO Auto-generated method stub
     97 
     98     }
     99 
    100     /**
    101      * SurfaceView视图消亡时,响应此函数
    102      */
    103     @Override
    104     public void surfaceDestroyed(SurfaceHolder holder) {
    105         flag = false;// 结束游戏,设置线程关闭标志为false
    106 
    107     }
    108 
    109     public void logic() {
    110 
    111     };
    112 
    113     @Override
    114     public void run() {
    115         while (flag) {
    116             long start = System.currentTimeMillis();
    117             mydraw();
    118             logic();
    119             long end = System.currentTimeMillis();
    120             try {
    121                 if (end - start < 50) {
    122                     Thread.sleep(50 - (end - start));
    123                 }
    124             } catch (InterruptedException e) {
    125                 e.printStackTrace();
    126             }
    127         }
    128     }
    129 
    130     // 获取点击坐标
    131     @Override
    132     public boolean onTouchEvent(MotionEvent event) {
    133         return true;
    134     }
    135 
    136 }
    clipView
     1 package caicai.animation;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.view.Window;
     6 import android.view.WindowManager;
     7 
     8 public class MainActivity extends Activity {
     9     /** Called when the activity is first created. */
    10     @Override
    11     public void onCreate(Bundle savedInstanceState) {
    12         super.onCreate(savedInstanceState);
    13         //设置全屏
    14         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    15         requestWindowFeature(Window.FEATURE_NO_TITLE);
    16         //显示自定义的SurfaceView视图
    17         setContentView(new clipView(this));
    18 
    19     }
    20 }
    MainActivity

    谢谢支持网站“趣淘鼓浪屿(www.qtgly.com)”

  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/clarence/p/3285271.html
Copyright © 2011-2022 走看看