andorid画画板

来源:互联网 发布:打字软件下载 编辑:程序博客网 时间:2024/06/02 17:08
package com.lyz.news.day32draw;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.net.Uri;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.ImageView;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;public class MainActivity extends Activity {    //        我要必须滴知道手指触摸的坐标    private ImageView miv;    private int startx;    private int starty;    private Canvas canvas;    private Bitmap copybp;    private Paint paint;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//          因为这个图片在drawable里所以这里我们就不能用decodeFile,抵用获取资源的//        加载画板的背景图        Bitmap srcbp = BitmapFactory.decodeResource(getResources(), R.drawable.bg);        //创建副本 新的画板        copybp = Bitmap.createBitmap(srcbp.getWidth(), srcbp.getHeight(), srcbp.getConfig());        //2.创建画笔        paint = new Paint();        //创建画布    //3创建画板来画画,把白纸放上        canvas = new Canvas(copybp);        //绘制        canvas.drawBitmap(copybp, new Matrix(), paint);//        Matrix matrix=new Matrix();//        miv = (ImageView) findViewById(R.id.miv);        //把我们的副本 给塞到imageview里,初始必须滴有一个画画板        miv.setImageBitmap(copybp);        //触摸监听能知道你触摸的坐标        miv.setOnTouchListener(new View.OnTouchListener() {//            用户触摸屏幕时调用,或是事件产生//            MotionEvent动作事件,谁触发这个方法这个View就是谁,哪个组件触摸他就是谁            /**             *             * @param v  谁触发这个方法这个View就是谁,哪个组件触摸他就是谁             * @param event 触摸事件有3种,1触摸按住没松开,2滑动,3触摸一下就松开了             * @return             */            @Override            public boolean onTouch(View v, MotionEvent event) {//                获取当前用户的动作是什么,他是int整型                int action = event.getAction();                switch (action) {                    case MotionEvent.ACTION_UP://触摸松开                        /**                         * 为什么这up里只有一个坐标数                         * 我先拿到第一次点下去的坐标x,y                         *///                        startx = (int) event.getX();//                        starty = (int) event.getY();//////                        Log.i(xup+"MainActivity", "触摸松开!!!!!!"+yup);                        break;                    case MotionEvent.ACTION_DOWN://触摸按下                        startx = (int) event.getX();                        starty = (int) event.getY();//                        Log.i("MainActivity", "触摸按了!!!");                        break;                    case MotionEvent.ACTION_MOVE://触摸移动                        /**                         * 再拿到用户触摸移动的坐标x,y                         * 用up的坐标和新的x,y之间画一条线canvas.drawLin                         */                        int x = (int) event.getX();                        int y = (int) event.getY();                        canvas.drawLine(startx, starty, x, y, paint);//                        作为下一次绘制线的初始坐标,每次绘制线的结束坐标,作为下一次绘制的开始坐标;                        startx = x;                        starty = y;//                        绘制完之后从新设置到imagev里,你会绘制完了,界面自己是不会刷新的;手动从新设置                        miv.setImageBitmap(copybp);//                        Log.i(y+"MainActivity", "触摸移动!!!"+x);                        break;                }//              这里要是true:就是告诉编译器触摸事件我自己来处理,//                false:就会只有触摸一下事件,没有松开和移动,交给了系统来处理,会把触摸事件传递给Imageview的父节点                /**                 * 你在imageview上移动时,会在两个组件上移动一个是imageview和RelativeLayout,如果false会让RelativeLayout来处理,要是                 * RelativeLayout的触摸事件也是false那再次向上传递,如果没有了(视频说没有了)就会丢弃了,没人处理了;                 * 最后记住:谁给true谁处理触摸监听,给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(7);    }//    这里为什么必须要传进来一个视图,可能没视图怎么操作;    /**     * 保存画好的图片     *     * @param v     */    public void save(View v) {//        保存的位置,输出流,        File file = new File("sdcard/lyz.png");//    自己设置一个,把file地址给塞进文件输出流        FileOutputStream fos = null;        try {            fos = new FileOutputStream(file);        } catch (Exception e) {            e.printStackTrace();        }/** * compress设置压缩格式, 每次启动系统会把多媒体东西包括图片和音乐播放器和视频播放器,存到一个叫Media的数据库, 拿文件,所以我们必须把让系统扫描一下sd,才会在图片库里显示 */        copybp.compress(Bitmap.CompressFormat.PNG, 100, fos);        //我们还发送一个广播让,sd遍历一下好让图片在sd卡能显示到图片库软件上。        //发送sd卡就绪广播        Intent intent = new Intent();        //设置系统的一个条安装MEDIA_这个位置的广播        intent.setAction(intent.ACTION_MEDIA_MOUNTED);//        必须规定data要不无法接收;getExternalStorageDirectory返回一个FILE对象SD卡的真实路径//        Environment  提供访问环境变量。        intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));        sendBroadcast(intent);        try {            fos.flush();            fos.close();        } catch (IOException e) {            e.printStackTrace();        }        //这里为什么空指针    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 社保停缴了里面的钱怎么办 王者荣耀英雄释放技能有延迟怎么办 买的桑拿木板颜色太深了怎么办 万一填写了奔跑吧诈骗信息该怎么办 深圳限行时段堵在路上怎么办 开车堵在路上到了限行时间怎么办 兄妹之间都不想照顾母亲我该怎么办 小孩扁体发炎睡觉呼吸声沉重怎么办 客所思pk3老驱动有杂音怎么办 手机打不开解压包密码怎么办 在香港专柜买东西柜员少给货怎么办 恶魔猎手第二神器任务没选择怎么办 电脑放久了开不了机怎么办 你在主持时说错话了怎么办 1、你在主持时说错话了怎么办? 领导让你替他参加重要会议怎么办 在备孕期老公照了片怎么办 和混混打架后被混混纠缠怎么办 开了一年的瑜伽馆想关掉会员怎么办 广东工厂宿舍里面床板有臭虫怎么办 胃癌手术后12天引流液多怎么办 八个月了胎儿头还在上面怎么办 喂奶一个月后奶头又裂开了怎么办 孩子吃奶吃的奶头裂开了怎么办 很想打坐久就是受不了腿疼怎么办 宝宝含乳一直纠正不过来怎么办 婴儿衘乳不正确只吸乳头怎么办 怀孕7个月了晚上睡不着怎么办 尚德学校学费交了一半退学怎么办 随着年龄的增长胸越来越来小怎么办 运动文胸里边的海绵垫会乱跑怎么办 带胸罩时在外面忽然扣子开了怎么办 我的脸一边大一边小怎么办 桶装水盖子吸在饮水机了怎么办? 孕37周大腿内侧被内裤磨烂怎么办 生存指南合成的时候闪退怎么办 王者荣耀队友用语音骂我怎么办? 轨道衡电子计量数据不对上怎么办 孕5个月胎儿发育慢怎么办 扎高马尾后面头发扎不上去怎么办 吃了不太新鲜的肉怎么办