转载

Android利用canvas画画板

首先新建一个项目工程,建立文件,如下图所示

首先配置页面布局文件activity_main.xml,如下图所示:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  2     xmlns:tools="http://schemas.android.com/tools"  3     android:layout_width="match_parent"  4     android:layout_height="match_parent"  5     android:orientation="vertical">  6   7     <ImageView  8         android:id="@+id/iv"  9         android:layout_width="wrap_content" 10         android:layout_height="wrap_content" 11         android:background="@drawable/bg" 12          /> 13     <TextView  14           android:layout_width="wrap_content" 15            android:layout_height="wrap_content" 16            android:text="画笔的粗细" 17         /> 18     <SeekBar  19          android:id="@+id/sb" 20         android:layout_width="match_parent" 21         android:layout_height="wrap_content" 22         android:max="256" 23         /> 24     <TextView  25           android:layout_width="wrap_content" 26            android:layout_height="wrap_content" 27            android:text="颜色" 28         /> 29     <Spinner  30         android:id="@+id/sp" 31          android:layout_width="wrap_content" 32            android:layout_height="wrap_content" 33            android:entries="@array/color" 34         /> 35     <Button  36             android:id="@+id/btn" 37           android:layout_width="wrap_content" 38            android:layout_height="wrap_content" 39            android:text="保存" 40         /> 41   42      43  44 </LinearLayout>

然后书写主页的代码MainActivity.java代码如下

  1 package com.xunfang.drawing;   2    3 import java.io.File;   4 import java.io.FileNotFoundException;   5 import java.io.FileOutputStream;   6    7 import android.app.Activity;   8 import android.content.Intent;   9 import android.graphics.Bitmap;  10 import android.graphics.Bitmap.CompressFormat;  11 import android.graphics.BitmapFactory;  12 import android.graphics.Canvas;  13 import android.graphics.Color;  14 import android.graphics.Matrix;  15 import android.graphics.Paint;  16 import android.net.Uri;  17 import android.os.Bundle;  18 import android.os.Environment;  19 import android.util.MonthDisplayHelper;  20 import android.view.Menu;  21 import android.view.MenuItem;  22 import android.view.MotionEvent;  23 import android.view.View;  24 import android.view.View.OnClickListener;  25 import android.view.View.OnTouchListener;  26 import android.widget.AdapterView;  27 import android.widget.AdapterView.OnItemClickListener;  28 import android.widget.AdapterView.OnItemSelectedListener;  29 import android.widget.Button;  30 import android.widget.ImageView;  31 import android.widget.SeekBar;  32 import android.widget.Spinner;  33 import android.widget.Toast;  34   35   36 public class MainActivity extends Activity {  37     private SeekBar sb;  38     private ImageView iv;  39     private Button btn;  40     private Spinner sp;  41     private String[] color ;  42        43     private Bitmap bm;  44     private Bitmap copy;  45     private  Canvas canvas;  46     private Paint paint;  47     private File file;  48     private int yanse;  49           50     @Override  51     protected void onCreate(Bundle savedInstanceState) {  52         super.onCreate(savedInstanceState);  53         setContentView(R.layout.activity_main);  54           55        //拿到在xml文件中定义的颜色数组  56         color = getResources().getStringArray(R.array.color) ;  57         //实例化  58         initData();  59         //设置监听器  60         setLister();  61         //画画  62         loadingImage();  63           64     }  65     private void loadingImage() {  66         // 加载原始图片  67         bm = BitmapFactory.decodeResource(getResources(), R.drawable.bg);  68         // 需要创建一个和原始的图片大小一样的空白图片(一张纸,上面没有任何数据)  69         copy = bm.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());  70         // 需要一个画板,画板上铺上白纸  71         canvas= new Canvas(copy);  72         // 创建画笔  73         paint= new Paint();  74           75         // 给imageView空间加载一个滑动监听器  76         iv.setOnTouchListener(new OnTouchListener() {  77             int startx;  78             int starty;  79             @Override  80             public boolean onTouch(View v, MotionEvent event) {  81                 // 拿到动作  82                 int type = event.getAction();  83                 switch (type) {  84                 case MotionEvent.ACTION_DOWN:  85                     startx = (int) event.getX();  86                     starty = (int) event.getY();  87                     break;  88                 case MotionEvent.ACTION_MOVE:  89                     int endx = (int) event.getX();  90                     int endy = (int) event.getY();  91                     //画画  92                     canvas.drawLine(startx, starty, endx, endy, paint);  93                     startx = (int) event.getX();  94                     starty = (int) event.getY();  95                     iv.setImageBitmap(copy);  96                     break;  97                 case MotionEvent.ACTION_UP:  98                       99                     break; 100                 } 101                 return true; 102             } 103         }); 104          105     } 106     private void setLister() { 107         //下拉框 108         sp.setOnItemSelectedListener(new OnItemSelectedListener() { 109             @Override 110             public void onItemSelected(AdapterView<?> parent, View view, 111                     int position, long id) { 112                 Toast.makeText(getApplicationContext(), "你点击的是:" +  color[position], 0).show();                 113                 switch (position) { 114                 case 1: 115                     paint.setColor(Color.GREEN); 116                     break; 117                 case 2: 118                     paint.setColor(Color.BLUE); 119                     break; 120                 case 3: 121                     paint.setColor(Color.BLACK); 122                     break; 123                 case 4: 124                     paint.setColor(Color.YELLOW); 125                     break; 126                 case 0: 127                     paint.setColor(Color.RED); 128                     break; 129                 } 130             } 131             @Override 132             public void onNothingSelected(AdapterView<?> parent) { 133             } 134         }); 135         //保存 136         btn.setOnClickListener(new OnClickListener() { 137             @Override 138             public void onClick(View v) { 139                 try { 140                     //指定图片的存储路径 141                     file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile()+"/draw.png"); 142                     FileOutputStream fos = new FileOutputStream(file); 143                     copy.compress(CompressFormat.PNG, 100, fos); 144                     Toast.makeText(getApplicationContext(), "保存成功", 0).show() ; 145                 } catch (Exception e) { 146                 } 147                 //欺骗系统,告诉系统插入一个sd卡 148                 Intent intent = new Intent(); 149                 intent.setAction(intent.ACTION_MEDIA_MOUNTED); 150                 intent.setData(Uri.fromFile(file)); 151                 sendBroadcast(intent); 152             } 153         }); 154     } 155     private void initData() { 156             sb = (SeekBar) findViewById(R.id.sb); 157             btn = (Button) findViewById(R.id.btn); 158             sp = (Spinner) findViewById(R.id.sp); 159             iv = (ImageView) findViewById(R.id.iv); 160     } 161  162  163 }

AndroidManifest.xml配置文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>  2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  3     package="com.xunfang.drawing"  4     android:versionCode="1"  5     android:versionName="1.0" >  6   7     <uses-sdk  8         android:minSdkVersion="16"  9         android:targetSdkVersion="21" /> 10  11     <application 12         android:allowBackup="true" 13         android:icon="@drawable/ic_launcher" 14         android:label="@string/app_name" 15         android:theme="@style/AppTheme" > 16         <activity 17             android:name=".MainActivity" 18             android:label="@string/app_name" > 19             <intent-filter> 20                 <action android:name="android.intent.action.MAIN" /> 21  22                 <category android:name="android.intent.category.LAUNCHER" /> 23             </intent-filter> 24         </activity> 25     </application> 26  27 </manifest>

然后用虚拟机测试如下所示:

可以在模拟器看一下,生成的文件

表示验证成功了

正文到此结束
Loading...