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(); } //这里为什么空指针 } }
andorid画画板
最新推荐文章于 2024-06-18 04:25:09 发布