package com.weipeng.xuexi20160119; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * Created by Administrator on 2016/1/19. */ public class DrawView3 extends View { private int view_width =0;//屏幕宽度 private int view_height=0;//屏幕高度 private float preX;//起始点的X坐标 private float preY;//起始点的Y坐标 private Path path;//路径 public Paint paint =null;//画笔 Bitmap cacheBitmap = null;//定义一个内存中的图片,该图片作为缓冲区 Canvas cacheCanvas =null;//定义cacheBitmap上的Cancas对象 public DrawView3(Context context, AttributeSet attrs) { super(context, attrs); view_width = context.getResources().getDisplayMetrics().widthPixels;//获取屏幕宽度 view_height = context.getResources().getDisplayMetrics().heightPixels;//获取屏幕高度 //创建一个与该View相同大小的缓冲区 cacheBitmap = Bitmap.createBitmap(view_width,view_height, Bitmap.Config.ARGB_8888); cacheCanvas = new Canvas();//创建一个新的画布 path = new Path(); cacheCanvas.setBitmap(cacheBitmap);//在cacheCanvas上绘制cacheBitmap paint = new Paint(Paint.DITHER_FLAG); paint.setColor(Color.RED); //设置画笔风格 paint.setStyle(Paint.Style.STROKE);//设置填充方式为描边 paint.setStrokeJoin(Paint.Join.ROUND);//设置笔刷图形样式 paint.setStrokeCap(Paint.Cap.ROUND);//设置画笔转弯处的连接风格 paint.setAntiAlias(true);//设置抗锯齿功能 paint.setStrokeWidth(1);//设置画笔默认笔触宽度为1像素 paint.setDither(true);//设置抖动效果 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(0xFFFFFFFF);//设置背景颜色 Paint bmpPaint = new Paint();//采用默认设置创建一个画笔 canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);//绘制cacheBitmap canvas.drawPath(path, paint);//绘制路径 canvas.save(Canvas.ALL_SAVE_FLAG);//保存canvas状态 canvas.restore(); //回复canvas之前保存的状态,防止保存后对canvas执行的操作对后续绘制有影响 } @Override public boolean onTouchEvent(MotionEvent event) { //获取触摸事件的位置 float x = event.getX(); float y = event.getY(); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: path.moveTo(x,y);//将绘制起点到xy坐标点位置 preX = x; preY = y; break; case MotionEvent.ACTION_MOVE: float dx = Math.abs(x - preX); float dy = Math.abs(y - preY); if(dx >= 5 || dy >= 5){//判断是否在允许的范围内 path.quadTo(preX,preY,(x+preX)/2,(y+preY)/2); preX = x; preY = y; } break; case MotionEvent.ACTION_UP: cacheCanvas.drawPath(path,paint);//绘制路径 path.reset(); break; } invalidate(); return true;//返回ture表示该方法已经处理该事件 } public void clear(){ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));//设置图形重叠时的处理方法 paint.setStrokeWidth(50);//设置画笔的宽度 } public void save(){ try { saveBitmap("1111"); } catch (IOException e) { e.printStackTrace(); } } private void saveBitmap(String filename) throws IOException { File file = new File("/sdcard/pictures/"+filename+".png"); file.createNewFile(); FileOutputStream fileOS = new FileOutputStream(file); cacheBitmap.compress(Bitmap.CompressFormat.PNG,100,fileOS); fileOS.flush(); fileOS.close(); }}
在mainActivity中重写方法:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = new MenuInflater(this); menuInflater.inflate(R.menu.toolsmenu,menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { DrawView3 dv = (DrawView3) findViewById(R.id.draw3); dv.paint.setXfermode(null);//取消擦出效果 dv.paint.setStrokeWidth(1);//初始化画笔宽度 switch (item.getItemId()){ case R.id.red: dv.paint.setColor(Color.RED); break; case R.id.green: dv.paint.setColor(Color.GREEN); break; case R.id.blue: dv.paint.setColor(Color.BLUE); break; case R.id.width_1: dv.paint.setStrokeWidth(1); break; case R.id.width_2: dv.paint.setStrokeWidth(2); break; case R.id.width_3: dv.paint.setStrokeWidth(3); break; case R.id.clear: dv.clear(); break; case R.id.save: dv.save(); break; } return super.onOptionsItemSelected(item); }
自定义menu菜单:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="颜色"> <menu> <group android:checkableBehavior="single"> <item android:id="@+id/red" android:title="红色"></item> <item android:id="@+id/green" android:title="绿色"></item> <item android:id="@+id/blue" android:title="蓝色"></item> </group> </menu> </item> <item android:title="width"> <menu> <group> <item android:id="@+id/width_1" android:title="width_1"></item> <item android:id="@+id/width_2" android:title="width_2"></item> <item android:id="@+id/width_3" android:title="width_3"></item> </group> </menu> </item> <item android:id="@+id/clear" android:title="清除"></item> <item android:id="@+id/save" android:title="保存"></item> </menu>
android 制作简单的画板
最新推荐文章于 2024-05-24 10:06:57 发布