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 }

 

posted on 2013-07-18 17:53  I love Android  阅读(523)  评论(0编辑  收藏  举报