zoukankan      html  css  js  c++  java
  • [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();
            }
            
        }
    }

  • 相关阅读:
    以友盟+U-Push为例,深度解读消息推送的筛选架构解决方案应用与实践
    [Python图像处理] 三十三.图像各种特效处理及原理万字详解(毛玻璃、浮雕、素描、怀旧、流年、滤镜等)
    走进PEP8——代码规范
    2020全球C++及系统软件技术大会成功落下帷幕
    逆向工程,调试Hello World !程序(更新中)
    520了,用32做个简单的小程序
    细数那些年我用过的前端开发工具
    细数那些年我用过的前端开发工具
    前端几个常用简单的开发手册拿走不谢
    前端几个常用简单的开发手册拿走不谢
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5347743.html
Copyright © 2011-2022 走看看