美文网首页
Bitmap操作图片之画画板

Bitmap操作图片之画画板

作者: MengkZhang | 来源:发表于2019-05-15 20:09 被阅读0次

画画板原理:

创建一个原图的副本来操作图片(详解见上一篇博客创建一个原图的副本来操作图片

在ImageView的onTouch触摸事件中,记录手指滑动的开始坐标和结束坐标,在结束坐标处画线canvas.drawLine();并改变开始坐标和结束坐标

触摸事件:

// [3]给iv设置一个触摸事件
        iv.setOnTouchListener(new OnTouchListener() {
            int startX = 0;
            int startY = 0;

            public boolean onTouch(View v, MotionEvent event) {
                // 获取当前事件类型
                int action = event.getAction();
                switch (action) {
                case MotionEvent.ACTION_DOWN: // 按下
                    System.out.println("摸view");
                    // 获取开始位置 (划线)

                    startX = (int) event.getX();
                    startY = (int) event.getY();

                    break;

                case MotionEvent.ACTION_MOVE:// 移动
                    System.out.println("移动");
                    // 获取结束位置
                    int stopX = (int) event.getX();
                    int stopY = (int) event.getY();
                    // [不停的画线]
                    canvas.drawLine(startX, startY, stopX, stopY, paint);
                    // 在次显示到iv上
                    iv.setImageBitmap(copyBitmap);

                    // 更新一下开始坐标和结束坐标
                    startX = stopX;
                    startY = stopY;

                    break;

                case MotionEvent.ACTION_UP:// 抬起
                    System.out.println("抬起");
                    break;
                }

                // True if the listener has consumed the event, false otherwise
                return true; // true 监听器处理完事件了
            }
        });

保存Bitmap图片到相册,并发送广播更新系统相册

        /**
         * format 保存图片的格式
         * quality 保存图片的质量 
         * SystemClock.uptimeMillis() 这个是当前手机的开机时间
         */
        try {
            File file = new File(Environment.getExternalStorageDirectory().getPath(),SystemClock.uptimeMillis()+".png");
            FileOutputStream fos = new FileOutputStream(file);      
            copyBitmap.compress(CompressFormat.PNG, 100, fos);
            
            //发送一条广播 欺骗系统图库的应用 
            Intent intent = new Intent();
            //设置action
            intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
            intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
            //发送一条广播
            sendBroadcast(intent);
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }

示例代码:

public class MainActivity extends Activity {

    private Bitmap srcBitmap;
    private ImageView iv;
    private Bitmap copyBitmap;
    private Paint paint;
    private Canvas canvas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 用来显示我们画的内容

        iv = (ImageView) findViewById(R.id.iv);
        // [1]获取原图 bg
        srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg);    

        // [2]获取原图的副本 相当于是一个空白 的白纸
        copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),
                srcBitmap.getHeight(), srcBitmap.getConfig());
        // 创建画笔
        paint = new Paint();
        // 创建一个画布
        canvas = new Canvas(copyBitmap);
        // 开始作画
        canvas.drawBitmap(srcBitmap, new Matrix(), paint);
        // canvas.drawLine(20, 30, 50, 80, paint);
        iv.setImageBitmap(copyBitmap);

        // [3]给iv设置一个触摸事件
        iv.setOnTouchListener(new OnTouchListener() {
            int startX = 0;
            int startY = 0;

            public boolean onTouch(View v, MotionEvent event) {
                // 获取当前事件类型
                int action = event.getAction();
                switch (action) {
                case MotionEvent.ACTION_DOWN: // 按下
                    System.out.println("摸view");
                    // 获取开始位置 (划线)

                    startX = (int) event.getX();
                    startY = (int) event.getY();

                    break;

                case MotionEvent.ACTION_MOVE:// 移动
                    System.out.println("移动");
                    // 获取结束位置
                    int stopX = (int) event.getX();
                    int stopY = (int) event.getY();
                    // [不停的画线]
                    canvas.drawLine(startX, startY, stopX, stopY, paint);
                    // 在次显示到iv上
                    iv.setImageBitmap(copyBitmap);

                    // 更新一下开始坐标和结束坐标
                    startX = stopX;
                    startY = stopY;

                    break;

                case MotionEvent.ACTION_UP:// 抬起
                    System.out.println("抬起");
                    break;
                }

                // True if the listener has consumed the event, false otherwise
                return true; // true 监听器处理完事件了
            }
        });

    }

    // 点击按钮 改变画笔的颜色
    public void click1(View v) {

        paint.setColor(Color.RED);
    }

    // 点击按钮 对画笔加粗
    public void click2(View v) {
        paint.setStrokeWidth(15);

    }
    
    // 点击按钮 保存图片到相册
    public void click3(View v) {

        /**
         * format 保存图片的格式
         * quality 保存图片的质量 
         * SystemClock.uptimeMillis() 这个是当前手机的开机时间
         */
        try {
            File file = new File(Environment.getExternalStorageDirectory().getPath(),SystemClock.uptimeMillis()+".png");
            FileOutputStream fos = new FileOutputStream(file);      
            copyBitmap.compress(CompressFormat.PNG, 100, fos);
            
            //发送一条广播 欺骗系统图库的应用 
            Intent intent = new Intent();
            //设置action
            intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
            intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
            //发送一条广播
            sendBroadcast(intent);
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    

}

程序运行结果:


Demo源码:
https://github.com/MengkZhang/paintabroad

相关文章

  • Bitmap操作图片之画画板

    画画板原理: 创建一个原图的副本来操作图片(详解见上一篇博客创建一个原图的副本来操作图片 在ImageView的o...

  • Android:圆角图片

    其原理就是:先建立一个与图片大小相同的透明的Bitmap画板然后在画板上画出一个想要的形状的区域。最后把源图片帖上。

  • 收集_Android源码文章

    一、Bitmap: Android bitmap压缩优化方案Android性能优化系列之Bitmap图片优化 二、...

  • 九、多媒体

    一、加载图片到内存 二、显示大图片 三、对图片的操作 缩放 (图像的操作步骤) 得到原图 创建拷贝 创建画板 创建...

  • Bitmap操作

    图片操作:当图片与裁剪后尺寸一致时,newBitmap不重复构建返回原bitmap地址。而多次图片操作时中途bit...

  • 实现圆角图片

    //设置圆角图片或者圆形图片 privateBitmapSettingBitmap(Bitmap bitmap) ...

  • Android 之 Bitmap 和 File 相互转换

    图片文件转为Bitmap对象 如果图片过大,可能导致Bitmap对象装不下图片解决办法: Bitmap对象保存味图片文件

  • Bitmap操作图片之刮刮奖

    刮刮奖又名撕开她的外衣小游戏,哈哈哈哈 原理:创建一个原图的副本来操作图片(详解见上一篇博客创建一个原图的副本来操...

  • Python S6-8 Matplotlib绘图

    facecolor:画板颜色 figure.savefig函数里面设定defacecolor会被保存到图片中。 画...

  • day17作业

    头像 画板bug:先前画的线会被画圆和画直线的操作给擦掉(重合时相当于橡皮檫)

网友评论

      本文标题:Bitmap操作图片之画画板

      本文链接:https://www.haomeiwen.com/subject/bkbmaqtx.html