• Andoid实现手动绘图


      1 public class MainActivity extends Activity
      2  {
      3  int width,height;
      4  private GameView gameview;
      5  private Canvas canvas;
      6  private Bitmap map;
      7  private Paint paint;
      8  public Path path;
      9  private int color,pen;
     10  private boolean isclear=true;
     11     @SuppressWarnings("deprecation")
     12     public void onCreate(Bundle savedInstanceState) {
     13         super.onCreate(savedInstanceState);
     14     
     15     //获得手机屏幕的宽度和高度
     16         width=getWindowManager().getDefaultDisplay().getWidth();
     17         height=getWindowManager().getDefaultDisplay().getHeight();
     18 
     19     //设置手机为全屏模式
     20          requestWindowFeature(Window.FEATURE_NO_TITLE);
     21          getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
     22 
     23         gameview=new GameView(this, width, height);
     24 
     25         setContentView(gameview);
     26         canvas=gameview.canvas;
     27         map=gameview.map;
     28         paint=gameview.paint;
     29         path=gameview.dpath;
     30         color=gameview.color;
     31     }
     32 
     33 //创建菜单
     34  public boolean onCreateOptionsMenu(Menu menu) {
     35             getMenuInflater().inflate(R.menu.activity_main, menu);
     36             return true;
     37         }
     38 
     39 //添加菜单事件监听
     40     @Override
     41     public boolean onOptionsItemSelected(MenuItem item) {
     42         switch (item.getItemId()) {
     43         case R.id.save:
     44             try 
     45             {
     46                 Random random=new Random();
     47                 int a=random.nextInt(100);//产生100以内的数据
     48                 File f=new File(Environment.getExternalStorageDirectory().getPath()+"/bitmap");
     49                 f.mkdir();
     50                     File file=new File(f,a+".jpg");
     51                     FileOutputStream outstream=new FileOutputStream(file);
     52 
     53                     map.compress(Bitmap.CompressFormat.PNG, 90, outstream);
     54                     //把bitmap对象保存一张jpg的图片
     55 
     56                     Toast.makeText(this, "保存成功!", Toast.LENGTH_LONG).show();
     57             }
     58             catch (FileNotFoundException e)
     59             {
     60                 e.printStackTrace();
     61             }
     62             break;
     63         case R.id.Color:
     64             if(path!=null)
     65             {
     66                 canvas.drawPath(path, paint);
     67                 gameview.invalidate();
     68             }
     69             Builder dialog=new AlertDialog.Builder(this);
     70             dialog.setSingleChoiceItems(new String[]{"红色","绿色","黄色","粉色"}, 0, new OnClickListener()
     71             {
     72                 public void onClick(DialogInterface arg0, int arg1) {
     73                      switch (arg1) 
     74                      {
     75                     case 0:
     76                         paint.setColor(Color.RED);
     77                         break;
     78                     case 1:
     79                         paint.setColor(Color.GREEN);
     80                         break;
     81                     case 2:
     82                         paint.setColor(Color.YELLOW);
     83                         break;
     84                     case 3:
     85                         paint.setColor(Color.MAGENTA);
     86                         break;
     87                     }
     88                      pen=paint.getColor();
     89                 }    
     90             });
     91             dialog.setPositiveButton("确定", null).create();
     92             dialog.show();
     93             gameview.invalidate();
     94             break;
     95         case R.id.Paintsize:
     96             paint.setStrokeWidth(5);
     97             gameview.invalidate();
     98             break;
     99         case R.id.background:
    100             canvas.drawColor(Color.DKGRAY);
    101             color=Color.CYAN;
    102             gameview.invalidate();
    103             break;
    104         case R.id.clear:
    105                 path=new Path();
    106                 gameview.invalidate();
    107             break;
    108         }
    109         return super.onOptionsItemSelected(item);
    110     }
    111 
    112 }
    113 
    114 
    115 2.绘图操作的GameView类
    116 
    117 public class GameView extends View implements OnTouchListener {
    118 private float mx,my;//用来存手指移动后的坐标
    119 public Bitmap map;//对图像的一些操作
    120 public Canvas canvas;
    121 public  Path dpath;//主要用来绘制图像的对象,他会把所有绘制的图像保存到path里面
    122 public Paint paint;//画笔
    123 public int color;
    124     public GameView(Context context,int width,int height) {
    125         super(context);
    126              map=Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_4444);//绘制一个与手机屏幕大小的BitMap对象
    127              canvas=new Canvas(map);
    128              paint=new Paint();
    129              paint.setAntiAlias(true);//消除锯齿
    130              paint.setStyle(Style.STROKE);//设置画笔结尾时的样式为圆润
    131              paint.setStrokeJoin(Paint.Join.ROUND);
    132              paint.setStrokeCap(Paint.Cap.SQUARE);
    133              paint.setColor(Color.MAGENTA);
    134              paint.setStrokeWidth(3);
    135 
    136          this.setOnTouchListener(this);//添加触屏操作
    137     }
    138 
    139     public void draw(Canvas canvas) {
    140         super.draw(canvas);
    141         canvas.drawColor(Color.WHITE);//这里具有清屏的意思
    142         color=Color.DKGRAY;
    143         canvas.drawBitmap(map, 0,0, paint);//从 0 0开始到map中的width,height的一块画布,也就是全屏幕的一块画布
    144         
    145         //保存上次绘制的路径,只要他不为空就绘制出上次绘制的图形
    146         if(dpath!=null)
    147         {
    148             canvas.drawPath(dpath, paint);
    149         }
    150     }
    151 
    152     public void touch_start(float x,float y)
    153     {
    154         dpath.moveTo(x, y);//设置绘制图形的起始点
    155     }
    156     public void touch_move(float x,float y)
    157     {
    158            // 从x1,y1到x2,y2画一条贝塞尔曲线,更平滑(直接用mPath.lineTo也是可以的)
    159            dpath.lineTo(x,y);
    160            mx = x;//把手指移动后的坐标存放到mx,my中,
    161            my = y;
    162     }
    163     public void touch_up()
    164     {
    165         dpath.lineTo(mx, my);//设置手指从按下到移动过后之间绘制一条线存放到path中,之后通过下面的方法绘制到屏幕上
    166         canvas.drawPath(dpath, paint);
    167     }
    168     public boolean onTouch(View arg0, MotionEvent event) 
    169     {
    170           float x = event.getX()获得手指放下的坐标
    171           float y = event.getY();
    172           switch (event.getAction())
    173          {
    174           case MotionEvent.ACTION_DOWN:
    175            // 每次down下去重新new一个Path,这是一个要注意的地方,每一次手指从触摸屏幕到离开屏幕,都是一次新的path路径,所以要重新绘制一个新的Path对象
    176            dpath = new Path();
    177            touch_start(x, y);//设置起始点
    178            invalidate();
    179            break;
    180           case MotionEvent.ACTION_MOVE:
    181            touch_move(x, y);
    182            invalidate();
    183            break;
    184           case MotionEvent.ACTION_UP:
    185            touch_up();
    186            //invalidate();
    187            break;
    188           }
    189           return true;
    190     }
    191 
    192 }
  • 相关阅读:
    ElasticSearch应用之数据埋点——认识埋点
    WebStorm好用的插件推荐
    mysql身份验证问题
    (一) MySql的安装
    (一)Mongodb的下载与安装
    解决Flask中 request.get_json()接收不到传来的json数据
    docker查看日志记录
    微信小程序右上角胶囊的信息
    linux shell 字符串操作(长度,查找,替换)详解
    Win7下的内置FTP组件的设置详解
  • 原文地址:https://www.cnblogs.com/tianshidechibang234/p/3198704.html
Copyright © 2020-2023  润新知