Android图形与图像处理-采用双缓冲实现画图板


Android图形与图像处理-采用双缓冲实现画图板

创建项目:HandDraw

运行项目效果:

DrawView.java

  1. package wwj.handdraw;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Bitmap.Config;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Color;  
  8. import android.graphics.Paint;  
  9. import android.graphics.Path;  
  10. import android.util.AttributeSet;  
  11. import android.view.MotionEvent;  
  12. import android.view.View;  
  13.   
  14. public class DrawView extends View{  
  15.     float preX;  
  16.     float preY;  
  17.     private Path path;  
  18.     public Paint paint = null;  
  19.     final int VIEW_WIDTH = 320;  
  20.     final int VIEW_HEIGHT = 480;  
  21.     //定义一个内存中的图片,该图片将作为缓冲区   
  22.     Bitmap cacheBitmap = null;  
  23.     //定义cacheBitmap上的Canvas对象   
  24.     Canvas cacheCanvas = null;  
  25.     public DrawView(Context context, AttributeSet attrs) {  
  26.         super(context, attrs);  
  27.         //创建一个与该View相同大小的缓冲区   
  28.         cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT, Config.ARGB_8888);  
  29.         cacheCanvas = new Canvas();  
  30.         path = new Path();  
  31.         //设置cacheCanvas将会绘制到内存中cacheBitmap上   
  32.         cacheCanvas.setBitmap(cacheBitmap);  
  33.         //设置画笔的颜色   
  34.         paint = new Paint(Paint.DITHER_FLAG);  
  35.         paint.setColor(Color.RED);  
  36.         //设置画笔风格   
  37.         paint.setStyle(Paint.Style.STROKE);  
  38.         paint.setStrokeWidth(1);  
  39.         //反锯齿   
  40.         paint.setAntiAlias(true);  
  41.         paint.setDither(true);  
  42.     }  
  43.     @Override  
  44.     public boolean onTouchEvent(MotionEvent event) {  
  45.         // TODO Auto-generated method stub   
  46.         //获取拖动事件的发生位置   
  47.         float x = event.getX();  
  48.         float y = event.getY();  
  49.         switch(event.getAction()){  
  50.         case MotionEvent.ACTION_DOWN:  
  51.             path.moveTo(x, y);  
  52.             preX = x;  
  53.             preY = y;  
  54.             break;  
  55.         case MotionEvent.ACTION_MOVE:  
  56.             path.quadTo(preX, preY, x, y);  
  57.             preX = x;  
  58.             preY = y;  
  59.             break;  
  60.         case MotionEvent.ACTION_UP:  
  61.             cacheCanvas.drawPath(path, paint);  
  62.             path.reset();  
  63.             break;  
  64.         }  
  65.         invalidate();  
  66.         //返回true表明处理方法已经处理该事件   
  67.         return true;  
  68.     }  
  69.     @Override  
  70.     protected void onDraw(Canvas canvas) {  
  71.         // TODO Auto-generated method stub   
  72.         Paint bmpPaint = new Paint();  
  73.         //将cacheBitmap绘制到该View组件   
  74.         canvas.drawBitmap(cacheBitmap, 00, bmpPaint);  
  75.         //沿着Path绘制   
  76.         canvas.drawPath(path, bmpPaint);  
  77.     }  
  78.               
  79. }  

menu文件:my_menu.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <item android:title="@string/color">  
  4.         <menu>  
  5.             <!-- 定义一组单选菜单项 -->  
  6.             <group android:checkableBehavior="single">  
  7.                 <!-- 定义多个菜单项 -->  
  8.                 <item  
  9.                     android:id="@+id/red" android:title="@string/color_red"/>  
  10.                 <item  
  11.                     android:id="@+id/green" android:title="@string/color_green"/>  
  12.                 <item  
  13.                     android:id="@+id/blue" android:title="@string/color_blue"/>  
  14.             </group>  
  15.         </menu>  
  16.     </item>  
  17.     <item android:title="@string/width">  
  18.         <menu>  
  19.             <!-- 定义一组菜单项 -->  
  20.             <group>  
  21.                 <!-- 定义3个菜单项 -->  
  22.                 <item  
  23.                     android:id="@+id/width_1" android:title="@string/width_1"/>  
  24.                 <item  
  25.                     android:id="@+id/width_3" android:title="@string/width_3"/>  
  26.                 <item  
  27.                     android:id="@+id/width_5" android:title="@string/width_5"/>                        
  28.             </group>  
  29.         </menu>  
  30.     </item>  
  31.     <item  
  32.         android:id="@+id/blur" android:title="@string/blur"/>      
  33.     <item  
  34.         android:id="@+id/emboss" android:title="@string/emboss"/>                              
  35. </menu>  

HandDraw.java

  1. package wwj.handdraw;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.graphics.BlurMaskFilter;  
  6. import android.graphics.Color;  
  7. import android.graphics.BlurMaskFilter.Blur;  
  8. import android.graphics.EmbossMaskFilter;  
  9. import android.view.Menu;  
  10. import android.view.MenuInflater;  
  11. import android.view.MenuItem;  
  12. import android.support.v4.app.NavUtils;  
  13.   
  14. public class HandDraw extends Activity {  
  15.       
  16.     EmbossMaskFilter emboss;  
  17.     BlurMaskFilter blur;  
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.         emboss = new EmbossMaskFilter(new float[]{1.5f, 1.5f, 1.5f}, 0.6f, 64.2f);  
  23.         blur = new BlurMaskFilter(8, Blur.NORMAL);  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean onCreateOptionsMenu(Menu menu) {  
  28.         MenuInflater inflator = new MenuInflater(this);  
  29.         //状态R.menu.context对应的菜单,并添加到menu中   
  30.         inflator.inflate(R.menu.my_menu, menu);  
  31.         return super.onCreateOptionsMenu(menu);  
  32.     }  
  33.       
  34.     @Override  
  35.     public boolean onOptionsItemSelected(MenuItem item) {  
  36.         // TODO Auto-generated method stub   
  37.         DrawView dv = (DrawView)findViewById(R.id.draw);  
  38.         //判断单击的是哪个菜单项,并有针对性地做出响应   
  39.         switch(item.getItemId()){  
  40.         case R.id.red:  
  41.             dv.paint.setColor(Color.RED);  
  42.             item.setChecked(true);  
  43.             break;  
  44.         case R.id.green:  
  45.             dv.paint.setColor(Color.GREEN);  
  46.             item.setChecked(true);  
  47.             break;  
  48.         case R.id.blue:  
  49.             dv.paint.setColor(Color.BLUE);  
  50.             item.setChecked(true);  
  51.             break;  
  52.         case R.id.width_1:  
  53.             dv.paint.setStrokeWidth(1);  
  54.             break;  
  55.         case R.id.width_3:  
  56.             dv.paint.setStrokeWidth(3);  
  57.             break;  
  58.         case R.id.width_5:  
  59.             dv.paint.setStrokeWidth(5);  
  60.             break;  
  61.         case R.id.blur:  
  62.             dv.paint.setMaskFilter(blur);  
  63.             break;  
  64.         case R.id.emboss:  
  65.             dv.paint.setMaskFilter(emboss);  
  66.             break;  
  67.         }  
  68.         return true;  
  69.     }  
  70. }  

布局文件:main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/LinearLayout1"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical" >  
  7.     <wwj.handdraw.DrawView  
  8.         android:id="@+id/draw"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:width="320px"  
  12.         android:height="480px"  
  13.         />  
  14. </LinearLayout>  
字符串文件:string.xml
  1. <resources>  
  2.   
  3.     <string name="app_name">手绘</string>  
  4.     <string name="hello_world">Hello world!</string>  
  5.     <string name="menu_settings">Settings</string>  
  6.     <string name="title_activity_hand_draw">HandDraw</string>  
  7.     <string name="width_1">1像素</string>  
  8.     <string name="width_3">3像素</string>  
  9.     <string name="width_5">5像素</string>  
  10.     <string name="color_red">红色</string>  
  11.     <string name="color_green">绿色</string>  
  12.     <string name="color_blue">蓝色</string>  
  13.     <string name="color">画笔颜色</string>  
  14.     <string name="width">画笔宽度</string>  
  15.     <string name="blur">模糊效果</string>  
  16.     <string name="emboss">浮雕效果</string>   
  17. </resources>  

相关内容