[android] 图片画画板

Posted 陶士涵的菜地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[android] 图片画画板相关的知识,希望对你有一定的参考价值。

页面布局,相对布局

按钮位于父窗体的下方使用android:layout_alignParentBottom=”true”

图片位于按钮的上方,填充父窗体,使用android:layout_above=”@+id/xxxxxid”

 

获取到ImageView对象

调用Bitmap.createBitmap(width,height,config)方法,创建一个可以被修改的Bitmap对象

参数:width height宽高写死,configBitmap.Config.ARGB_8888

 

获取Canvas对象,通过new Canvas(bitmap)

调用Canvas对象的drawColor()方法,初始化背景颜色,参数:Color.WHITE白色

 

调用ImageView对象的setOnTouchListener()方法,参数:OnTouchListener对象,这个类是一个接口类型,因此直接new它创建匿名内部类实现方法onTouch()

 

onTouch(View v,MotionEvent event)方法里面

参数:View对象是被触摸的对象,MotionEvent对象是触摸事件对象

调用MotionEvent对象的getAction()方法,获取触摸事件

switch判断这个事件

事件为MotionEvent.ACTION_DOWN是手指第一次触摸屏幕

事件为MotionEvent.ACTION_MOVE是手指在屏幕上移动

事件为MotionEvent.ACTION_UP是手指离开屏幕

 

当手指触摸屏幕时

定义手指开始位置的坐标startX startY

调用MotionEvent对象的getX() getY()方法,可以得到坐标

当手指移动的时候,我们要获取新的坐标newXnewY,方法和上面一样

调用Canvas对象的drawLine()方法,画一条线,参数:startXstartYnewXnewYpaint

 

获取Paint画笔对象,通过new出来

调用Paint对象的setTrokeWidth()方法,设置画笔粗细,参数:像素

调用Paint对象的setColor()方法,设置画笔颜色,参数:Color.GREEN

注意要从新更新画笔的位置

调用ImageView对象的setImageBitmap(bitmap)方法,把Bitmap显示到控件里

 

onTouch()方法一定要返回true,才能被持续执行

 

点击保存按钮,把图片保存到SD卡上

调用Bitmap对象的compress()方法,参数:图片格式CompressFormat.JPEG,图片质量100,输出流

获取File对象,通过new File(Environment.getExternalStorageDirectory(),文件名),文件名是时间戳

获取FileOutputStream对象

需要权限android.permission.WRITE_EXTERNAL_STORGE

 

使用系统图库查看图片

此时会看不到,以为图库只有在sd卡挂载的时候,才扫描文件

获取Intent对象,通过new出来

调用Intent对象的setAction()方法,参数:Intent.ACTION_MEDIA_MOUNTED

调用Intent对象的setData()方法,

参数:文件目录对象Uri.fromFile(Environment.getExternalStorageDirectory())

调用sendBroadcast()方法 发送广播

 代码:

package com.tsh.tshpaint;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.InputDevice.MotionRange;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private ImageView iv_img;
    private Bitmap baseBitmap;
    private Canvas canvas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_img = (ImageView) findViewById(R.id.iv_img);
        // 创建空Bitmap
        baseBitmap = Bitmap.createBitmap(320, 359, Bitmap.Config.ARGB_8888);
        canvas = new Canvas(baseBitmap);
        canvas.drawColor(Color.WHITE);
        // 设置手指滑动事件
        iv_img.setOnTouchListener(new OnTouchListener() {
            int startX;
            int startY;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                
                //画笔
                Paint paint=new Paint();
                paint.setStrokeWidth(5);
                paint.setColor(Color.GREEN);
                switch (action) {
                // 手指按下
                case MotionEvent.ACTION_DOWN:
                    startX=(int) event.getX();
                    startY=(int) event.getY();
                    break;
                // 手指移动
                case MotionEvent.ACTION_MOVE:
                    int newX=(int) event.getX();
                    int newY=(int) event.getY();
                    //划线
                    canvas.drawLine(startX, startY, newX, newY, paint);
                    startX=(int) event.getX();
                    startY=(int) event.getY();
                    iv_img.setImageBitmap(baseBitmap);
                    break;
                // 手指离开
                case MotionEvent.ACTION_UP:

                    break;
                }
                return true;
            }
        });
    }
    //保存图片
    public void save(View v){
        File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
        FileOutputStream stream;
        try {
            stream = new FileOutputStream(file);
            baseBitmap.compress(CompressFormat.JPEG, 100, stream);
            stream.close();
            //发送sd卡挂载通知
            Intent intent=new Intent();
            intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
            intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
            sendBroadcast(intent);
            
            Toast.makeText(this, "保存图片成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "保存图片失败", 0).show();
        }
        
    }
}

技术分享

以上是关于[android] 图片画画板的主要内容,如果未能解决你的问题,请参考以下文章

苹果手机。在一个手指触摸屏幕时检测另一个手指触摸

android 触摸屏2点和10点的区别

Android的MotionEvent和事件处理

从源码角度分析Android 事件分发机制以及常见滑动冲突解决方案

从源码角度分析Android 事件分发机制以及常见滑动冲突解决方案

HarmonyOS - 基于ArkUI (JS) 实现图片旋转验证