简易画图画板

    xiaoxiao2021-12-14  22

    import java.io.File; import java.io.FileOutputStream; 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.os.SystemClock; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.Toast; //要写一个外部存储的权限 public class MainActivity extends Activity implements OnClickListener { private View red, green, yellow, purple, blue; private SeekBar seekbar; private Paint paint; private ImageView iv; /** * 一个可以被修改的图片 */ private Bitmap alterBitmap; /** * 画板 */ private Canvas canvas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建一个空白的图片 //因为是创建空白的图片 所以宽和高可随意设置 //第一个参数是宽 //第二个参数是高 //第三个参数是 类型 Bitmap.Config.ARGB_8888 代表高质量的位图 alterBitmap = Bitmap.createBitmap(320, 320, Bitmap.Config.ARGB_8888); canvas = new Canvas(alterBitmap); paint = new Paint(); // 设置画笔的颜色 paint.setColor(Color.BLACK); canvas.drawColor(Color.WHITE);//设置画板的颜色为白色 // 设置画笔的宽度 paint.setStrokeWidth(5); seekbar = (SeekBar) findViewById(R.id.seekbar); //设置变化的进度条监听器 seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override //停止时调用的方法 public void onStopTrackingTouch(SeekBar seekBar) { int progress = seekBar.getProgress(); paint.setStrokeWidth(progress); Toast.makeText(MainActivity.this, "画笔宽度为:" + progress, 0) .show(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } }); red = findViewById(R.id.red); red.setOnClickListener(this); green = findViewById(R.id.green); green.setOnClickListener(this); yellow = findViewById(R.id.yellow); yellow.setOnClickListener(this); purple = findViewById(R.id.purple); purple.setOnClickListener(this); blue = findViewById(R.id.blue); blue.setOnClickListener(this); iv = (ImageView) findViewById(R.id.iv); // 给imageview的控件注册一个触摸事件 iv.setOnTouchListener(new OnTouchListener() { //定义坐标值 int startX; //就是说定义控件上的起始位置 int startY; // 当imageview被触摸的时候调用的方法. @Override public boolean onTouch(View v, MotionEvent event) { //MotionEvent代表当时的手势事件 switch (event.getAction()) {//获取当前的动作 case MotionEvent.ACTION_DOWN:// 按下 System.out.println("摸到"); startX = (int) event.getX(); //用当前的这个事件 get 获取 x 就得到 手在屏幕上按下的水平方向的坐标 startY = (int) event.getY();//用当前的这个事件 get 获取 x 就得到 手在屏幕上按下的水平方向的坐标 break; case MotionEvent.ACTION_MOVE:// 移动 System.out.println("移动"); int newX = (int) event.getX();//得到新的坐标 int newY = (int) event.getY();//得到新的坐标 //有了开始的坐标 和 新的坐标 就可以 在画板上做画 了 //之前用的一直是是以原图为模版画以个图片 //现在用的是画一条线的方法 /*1.开始的x坐标 * 2.开始的y坐标 * 3.结束的x坐标 * 4.结束的y坐标 * 5.画笔作画 * */ canvas.drawLine(startX, startY, newX, newY, paint); //将画面写到界面上 iv.setImageBitmap(alterBitmap); // 记得重新初始化手指在屏幕上的坐标 //防止线条不是一条线显示的 startX = (int) event.getX(); startY = (int) event.getY(); break; case MotionEvent.ACTION_UP:// 离开 System.out.println("放手"); break; } return true;// false代表的是事件没有处理完毕,等待事件处理完毕, true代表事件已经处理完毕了. } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.red: paint.setColor(Color.RED); Toast.makeText(MainActivity.this, "画笔红色", 0).show(); break; case R.id.yellow: paint.setColor(Color.YELLOW); Toast.makeText(MainActivity.this, "画笔黄色", 0).show(); break; case R.id.green: paint.setColor(Color.GREEN); Toast.makeText(MainActivity.this, "画笔绿色", 0).show(); break; case R.id.purple: paint.setColor(0xffff00ff); Toast.makeText(MainActivity.this, "画笔紫色", 0).show(); break; case R.id.blue: paint.setColor(Color.BLUE); Toast.makeText(MainActivity.this, "画笔蓝色", 0).show(); break; } } @Override //创建选项菜单调用的方法 //就是在按返回键的时候下面会弹出一个小的提示框 settings 那么如何 修改个个提示框呢 //按住ctrl 鼠标点击代码中的main 就会直接蹦到对应的 xml 中 然后修改 public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu);//点击此代码中的main return true; } @Override //选项菜单被选中调用的方法 public boolean onOptionsItemSelected(MenuItem item) { //item 是选项菜单中的显示框 获取他的id //如果视图中的视图框 正好被用户点击 如果这个id 等于 item_save 就说明正好点击的是保存的小条目 if (item.getItemId() == R.id.item_save) { // 保存图片 try { //sd卡的路径 File file = new File(Environment.getExternalStorageDirectory(), // 文件名: 开机时间+.jpg SystemClock.currentThreadTimeMillis() + ".jpg"); FileOutputStream stream = new FileOutputStream(file); // 保存位图 保存 保存的格式 图片的质量 输出流 alterBitmap.compress(CompressFormat.JPEG, 100, stream); stream.close(); Toast.makeText(this, "保存成功", 0).show(); //模拟一个sd卡插入广播. Intent intent = new Intent(); //sd卡被挂在的动作 intent.setAction(Intent.ACTION_MEDIA_MOUNTED);//sd卡被挂在的动作 //获取外部存储卡的目录 intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory())); sendBroadcast(intent); //发送广播 } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "保存失败", 0).show(); } } return super.onOptionsItemSelected(item); } }
    转载请注明原文地址: https://ju.6miu.com/read-971700.html

    最新回复(0)