zoukankan      html  css  js  c++  java
  • 画画板

    #画画板(掌握)
    >记录用户触摸事件的XY坐标,绘制直线
    * 给ImageView设置触摸侦听,得到用户的触摸事件,并获知用户触摸ImageView的坐标
     
    iv.setOnTouchListener(new OnTouchListener() {
     
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    switch (event.getAction()) {
    //触摸屏幕
    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();
    //用上次onTouch方法得到的坐标和本次得到的坐标绘制直线
    canvas.drawLine(startX, startY, newX, newY, paint);
    iv.setImageBitmap(copyBm);
    startX = newX;
    startY = newY;
    break;
     
    }
    return true;
    }
    });
    * 刷子效果,加粗画笔
     
    paint.setStrokeWidth(8);
    * 调色板,改变画笔颜色
     
    paint.setColor(Color.GREEN);
    * 保存图片至SD卡
     
    FileOutputStream fos = null;
    try {
    fos = new FileOutputStream(new File("sdcard/dazuo.png"));
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    //保存图片
         copyBm.compress(CompressFormat.PNG, 100, fos);
    * 系统每次收到SD卡就绪广播时,都会去遍历sd卡的所有文件和文件夹,把遍历到的所有多媒体文件都在MediaStore数据库保存一个索引,这个索引包含多媒体文件的文件名、路径、大小
    * 图库每次打开时,并不会去遍历sd卡获取图片,而是通过内容提供者从MediaStore数据库中获取图片的信息,然后读取该图片
    * 系统开机或者点击加载sd卡按钮时,系统会发送sd卡就绪广播,我们也可以手动发送就绪广播
     
    Intent intent = new Intent();
         intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
         intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
         sendBroadcast(intent);
     
    源代码:
    package com.itheima.paintboard;
     
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
     
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.Bitmap.CompressFormat;
    import android.view.Menu;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;
     
    public class MainActivity extends Activity {
    private int startX;
    private int startY;
    private Paint paint;
    private Canvas canvas;
    private ImageView iv;
    private Bitmap bmCopy;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     
    Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
    //白纸
    bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
    //笔
    paint = new Paint();
    //画板
    canvas = new Canvas(bmCopy);
    //作画
    canvas.drawBitmap(bmSrc, new Matrix(), paint);
     
    iv = (ImageView) findViewById(R.id.iv);
    iv.setImageBitmap(bmCopy);
     
    iv.setOnTouchListener(new OnTouchListener() {
     
    //用户手指只要触摸屏幕,就会产生触摸事件
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    //判断触摸事件的类型
    switch (event.getAction()) {
    //手指触摸
    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);
     
    //刷新,因为每次滑动绘画时,图片保存在缓存里,所以需要重新设置ImageView进行刷新到界面上
     
     
    iv.setImageBitmap(bmCopy);
     
    //把本此画线的终点设置为下一次画线的起点
    startX = newX;
    startY = newY;
    break;
    //手指抬起
    case MotionEvent.ACTION_UP:
    break;
     
    }
    //true表示告诉系统,这个触摸事件由iv处理
    //false表示不处理该触摸事件,事件往上传递
    return true;
    }
    });
    }
     
    public void red(View v){
    paint.setColor(Color.RED);
    }
     
    public void green(View v){
    paint.setColor(Color.GREEN);
    }
     
    public void brush(View v){
    //改变线条粗细
    paint.setStrokeWidth(8);
    }
     
    public void save(View v){
    File file = new File("sdcard/dazuo.png");
    FileOutputStream fos;
    try {
    fos = new FileOutputStream(file);
    //把图片压缩到本地文件
    bmCopy.compress(CompressFormat.PNG, 100, fos);
    fos.close();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
     
    //手动发一个sd卡就绪广播
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
    intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
    sendBroadcast(intent);
    }
     
     
    }
  • 相关阅读:
    QSPI
    温度标准
    minigui占用空间的情况
    引导页的展示
    Xcode6.0以后SVN的配置
    【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
    SDWebImage最新使用
    OC设计模式
    Objective-c的@property 详解
    iOS开发时间戳与时间,时区的转换,汉字与UTF8,16进制的转换
  • 原文地址:https://www.cnblogs.com/SoulCode/p/6393342.html
Copyright © 2011-2022 走看看