android之画板功能之橡皮擦 画笔大小和画笔颜色

第一展示设置画笔颜色的功能,第二展示设置画笔大小的颜色,而第三则展示橡皮擦的功能,这节将图标颜色设置为了蓝色,并且,增加了最左边的按钮(其实,就是在gridview中多增加了一个item)。

下面分别讨论,橡皮擦,设置画笔大小,设置画笔颜色的主要思想:

1. 橡皮擦功能:

基本原理:橡皮擦就是用和画布颜色一致颜色的画笔在屏幕触摸,简接实现橡皮擦的功能。

1)初始化画笔,并且设置画笔的颜色为白色(这里其实要设置为画布的颜色)。

2)设置画笔的大小为合适的大小。

3)用一个变量记住橡皮擦的颜色,用于在其他操作后重新使用橡皮擦。

 

2. 设置画笔大小的功能:

1)初始化画笔。

2)设置画笔的大小为所选择的大小。

3)用一个变量记住当前画笔的大小,用于在进行其他操作后还保持之前设置的画笔大小。

 

3. 设置画笔颜色的功能:

1)初始化画笔。

2)设置画笔的颜色为所选择的颜色。

3)用一个变量记住当前画笔的颜色,用于在进行其他操作后还保持之前设置的画笔颜色。

主要代码如下:

private Bitmap  mBitmap;
private int currentColor = Color.RED;        
private int currentSize = 5;
private int currentStyle = 1;
//设置画笔样式 
      public void setPaintStyle(){
          mPaint = new Paint();
          mPaint.setAntiAlias(true);
          mPaint.setDither(true);
          mPaint.setStyle(Paint.Style.STROKE);
          mPaint.setStrokeJoin(Paint.Join.ROUND);
          mPaint.setStrokeCap(Paint.Cap.ROUND);
          mPaint.setStrokeWidth(currentSize);
          if(currentStyle == 1)
              mPaint.setColor(currentColor);
          else{
              mPaint.setColor(Color.WHITE);
          }
      }        
//初始化画布
 public void initCanvas(){
     
     setPaintStyle();
     mBitmapPaint = new Paint(Paint.DITHER_FLAG);
     
     //画布大小 
     mBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, 
         Bitmap.Config.RGB_565);
     mCanvas = new Canvas(mBitmap);  //所有mCanvas画的东西都被保存在了mBitmap中
     
     mCanvas.drawColor(Color.WHITE);
     mPath = new Path();
     mBitmapPaint = new Paint(Paint.DITHER_FLAG);
     
 }

设置画笔样式:

//设置画笔样式
  public void selectPaintStyle(int which){
      
      if(which == 0){
          currentStyle = 1;
          setPaintStyle();
      }
      //当选择的是橡皮擦时,设置颜色为白色
      if(which == 1){
          currentStyle = 2;
          setPaintStyle();
          mPaint.setStrokeWidth(20);
      }
  }

设置画笔大小:

//选择画笔大小
  public void selectPaintSize(int which){
      
      int size =Integer.parseInt(this.getResources().getStringArray(R.array.paintsize)[which]); 
      currentSize = size;
      setPaintStyle();
  }

设置画笔颜色:

//设置画笔颜色
  public void selectPaintColor(int which){
      
      currentColor = paintColor[which];
      setPaintStyle();
  }

当然了,这些方法都是在自定义view,即PaintView中实现的,接下来就是通过单击底部按钮,调用自定义View的方法,实现相应的功能

//选择画笔样式
             case 0:
                 showMoreDialog(view);
                 break;
             //画笔大小
             case 1:
                 showPaintSizeDialog(view);
                 break;
             //画笔颜色
             case 2:
                 showPaintColorDialog(view);
                 break;
      //弹出画笔颜色选项对话框
    public void showPaintColorDialog(View parent){
        
        
        
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this,R.style.custom_dialog);
alertDialogBuilder.setTitle("选择画笔颜色:");

alertDialogBuilder.setSingleChoiceItems(R.array.paintcolor, select_paint_color_index, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        select_paint_color_index = which;
        paintView.selectPaintColor(which);
        dialog.dismiss();
    }
});

alertDialogBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
    }
});
alertDialogBuilder.create().show();
    }
    
    
    
  //弹出画笔大小选项对话框
    public void showPaintSizeDialog(View parent){
        
        
        
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this,R.style.custom_dialog);
alertDialogBuilder.setTitle("选择画笔大小:");

alertDialogBuilder.setSingleChoiceItems(R.array.paintsize, select_paint_size_index, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        select_paint_size_index = which;
        paintView.selectPaintSize(which);
        dialog.dismiss();
    }
});

alertDialogBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
    }
});
alertDialogBuilder.create().show();
    }
    
    
    //弹出选择画笔或橡皮擦的对话框
    public void showMoreDialog(View parent){
        
        
        
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this,R.style.custom_dialog);
alertDialogBuilder.setTitle("选择画笔或橡皮擦:");

alertDialogBuilder.setSingleChoiceItems(R.array.paintstyle, select_paint_style_index, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        select_paint_style_index = which;
        paintView.selectPaintStyle(which);
        dialog.dismiss();
    }
});

alertDialogBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
    }
});
alertDialogBuilder.create().show();
    }
     

这里面用到arrays.xml,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="paintstyle">
        <item>@string/track_line</item>
        <item>@string/Eraser</item>
    </string-array>
    <string-array name="paintsize">
        <item>5</item>
        <item>10</item>
        <item>15</item>
        <item>20</item>
        <item>25</item>
        <item>30</item>
    </string-array>
 
    <string-array name="paintcolor">
        <item>RED</item>
        <item>BLUE</item>
        <item>BLACK</item>
        <item>GREEN</item>
        <item>YELLOW</item>
        <item>CYAN</item>
        <item>LTGRAY</item>
    </string-array>
    
</resources>

至此,已实现了画板所有的功能。

其实,还有一个比较有趣的功能,就是为画笔设置一个铅笔的图标,主要原理,就是在自定义View中的ondraw方法中,将铅笔图片加载进去,并设置图片随着路径移动。

在自定义View中的ondraw方法中添加:

//移动时,显示画笔图标
       if(this.isMoving && currentColor != Color.WHITE){
           //设置画笔的图标
               Bitmap pen = BitmapFactory.decodeResource(this.getResources(),
                           R.drawable.pen);
               canvas.drawBitmap(pen, this.mX, this.mY - pen.getHeight(),
                           new Paint(Paint.DITHER_FLAG));
       }    

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Android 画板示例代码,包括涂鸦、改变颜色橡皮擦、调节画笔粗细、撤销上一步和保存图片等功能: MainActivity.java: ```java public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final int REQUEST_PERMISSION_CODE = 1001; private static final int MAX_STEP = 10; private static final int DEFAULT_COLOR = Color.BLACK; private static final int DEFAULT_SIZE = 5; private SurfaceView mSurfaceView; private Button mColorButton; private Button mEraserButton; private SeekBar mSizeSeekBar; private Button mUndoButton; private Button mSaveButton; private Paint mPaint; private int mColor = DEFAULT_COLOR; private int mSize = DEFAULT_SIZE; private Bitmap mBitmap; private Canvas mCanvas; private Stack<Bitmap> mBitmapStack; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSurfaceView = findViewById(R.id.surface_view); mColorButton = findViewById(R.id.color_button); mEraserButton = findViewById(R.id.eraser_button); mSizeSeekBar = findViewById(R.id.size_seek_bar); mUndoButton = findViewById(R.id.undo_button); mSaveButton = findViewById(R.id.save_button); mColorButton.setOnClickListener(this); mEraserButton.setOnClickListener(this); mUndoButton.setOnClickListener(this); mSaveButton.setOnClickListener(this); mSizeSeekBar.setMax(100); mSizeSeekBar.setProgress(DEFAULT_SIZE); mSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { mSize = progress; } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); mPaint = new Paint(); mPaint.setColor(mColor); mPaint.setStrokeWidth(mSize); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeJoin(Paint.Join.ROUND); mBitmap = Bitmap.createBitmap(mSurfaceView.getWidth(), mSurfaceView.getHeight(), Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); mBitmapStack = new Stack<>(); mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { mCanvas.drawColor(Color.WHITE); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); mCanvas.setBitmap(mBitmap); } @Override public void surfaceDestroyed(SurfaceHolder holder) { mBitmap.recycle(); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.color_button: showColorPickerDialog(); break; case R.id.eraser_button: mColor = Color.WHITE; mPaint.setColor(mColor); break; case R.id.undo_button: undo(); break; case R.id.save_button: saveImage(); break; } } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { mBitmapStack.push(Bitmap.createBitmap(mBitmap)); } if (event.getAction() == MotionEvent.ACTION_MOVE || event.getAction() == MotionEvent.ACTION_DOWN) { float x = event.getX(); float y = event.getY(); mCanvas.drawPoint(x, y, mPaint); mSurfaceView.getHolder().unlockCanvasAndPost(mCanvas); } if (mBitmapStack.size() > MAX_STEP) { mBitmapStack.remove(0); } return true; } private void showColorPickerDialog() { ColorPickerDialogBuilder .with(this) .setTitle("Color Picker") .initialColor(mColor) .wheelType(ColorPickerView.WHEEL_TYPE.FLOWER) .density(12) .setPositiveButton("OK", new ColorPickerClickListener() { @Override public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) { mColor = selectedColor; mPaint.setColor(mColor); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .build() .show(); } private void undo() { if (!mBitmapStack.isEmpty()) { mBitmap = mBitmapStack.pop(); mCanvas.setBitmap(mBitmap); mSurfaceView.getHolder().unlockCanvasAndPost(mCanvas); } } private void saveImage() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE); return; } } String fileName = "Drawing_" + System.currentTimeMillis() + ".png"; File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), fileName); try { FileOutputStream fos = new FileOutputStream(file); mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); Toast.makeText(this, "Image saved to " + file.getAbsolutePath(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "Failed to save image", Toast.LENGTH_SHORT).show(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case REQUEST_PERMISSION_CODE: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { saveImage(); } else { Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show(); } break; } } } ``` activity_main.xml: ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/tool_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" android:padding="16dp"> <Button android:id="@+id/color_button" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginEnd="16dp" android:backgroundTint="@color/black" android:textColor="@color/white" android:text="C" /> <Button android:id="@+id/eraser_button" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginEnd="16dp" android:backgroundTint="@color/white" android:textColor="@color/black" android:text="E" /> <SeekBar android:id="@+id/size_seek_bar" android:layout_width="0dp" android:layout_height="48dp" android:layout_marginEnd="16dp" android:layout_weight="1" /> <Button android:id="@+id/undo_button" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginEnd="16dp" android:backgroundTint="@color/black" android:textColor="@color/white" android:text="U" /> <Button android:id="@+id/save_button" android:layout_width="48dp" android:layout_height="48dp" android:backgroundTint="@color/black" android:textColor="@color/white" android:text="S" /> </LinearLayout> </RelativeLayout> ``` 这个示例代码中包含了涂鸦、改变颜色橡皮擦、调节画笔粗细、撤销上一步和保存图片等功能,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值