android 制作简单的画板
2016-01-21 20:37
471 查看
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 Studio生成的软件没有标题栏
- Android BLE与终端通信(三)——客户端与服务端通信过程以及实现
- android 自定义控件以及自定义view学习(随机验证码生成)
- Android 内存优化之OOM
- Android 内存优化之OOM
- 一键加群android代码如何使用!
- 如何在大脑里安装一部iPhone?
- android studio的使用:虚拟手机与真机的设置
- Android Java四种引用区分 <17>
- Android的监听机制
- Android 零碎知识——获取手机的信息
- 33.Android之Fragment学习
- android去掉顶部蓝色框方法
- android开发之Camera(相机)
- Android Image点击效果
- Android HorizontalScrollView ScrollView 消除阴影
- 调查应用的RAM使用情况
- Android TextView之Html.fromHtml学习(二)
- #Android源代码#android:onClick属性的底层调用
- 浅谈android Animation Animator 的实现原理