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();
            }
            
        }
    }

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5347743.html
Copyright © 2011-2022 走看看