andorid画画板

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


        //这里为什么空指针

    }


}
(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值