package com.example.administrator.myapplication03; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.net.Uri; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity { private ImageView img; private Button btn1; private Bitmap bitmap; private Canvas canvas; private Paint paint; private Button btn2; private Context context; private Button btn3; private Button btn4; private Button btn5; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img = findViewById(R.id.img); btn1 = findViewById(R.id.btn1); btn2 = findViewById(R.id.btn2); btn3 = findViewById(R.id.btn3); btn4 = findViewById(R.id.btn4); btn5 = findViewById(R.id.btn5); //清除画布上的图案 btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { img.setImageBitmap(null); showImage(); } }); //画笔改变颜色 btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //画笔颜色为红色 paint.setColor(Color.RED); } }); btn3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //画笔颜色为蓝色 paint.setColor(Color.BLUE); } }); //画笔加粗 btn4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //宽度5像素 paint.setStrokeWidth(5); } }); //保存 btn5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //根据当前时间当做文件夹 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(System.currentTimeMillis());//获取当前时间 // String str= format.format(date) + "paint.png"; File file = new File("sdcard/" + str); FileOutputStream stream=null; try { stream=new FileOutputStream(file); } catch (Exception e) { e.printStackTrace(); } bitmap.compress(Bitmap.CompressFormat.PNG,100,stream); //发送Sd卡的就绪广播,要不然在手机图库中不存在 Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED); intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory())); Toast.makeText(MainActivity.this,"已经保存图片",Toast.LENGTH_SHORT).show(); } }); //绘图 showImage(); } @SuppressLint("ClickableViewAccessibility") private void showImage() { //创建一张空白页面 bitmap = Bitmap.createBitmap(720, 1000, Bitmap.Config.ARGB_8888); //创建一张画布 canvas = new Canvas(bitmap); //画布背景为白色 //canvas.drawColor(Color.WHITE); //创建画笔 paint = new Paint(); //画笔颜色为黑色 paint.setColor(Color.BLACK); //现将白色背景画上 canvas.drawBitmap(bitmap,new Matrix(),paint); img.setImageBitmap(bitmap); img.setOnTouchListener(new View.OnTouchListener() { int startX; int startY; @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 endX = (int) event.getX(); int endY = (int) event.getY(); // 在开始和结束坐标间画一条线 canvas.drawLine(startX, startY, endX, endY, paint); // 刷新开始坐标 startX = (int) event.getX(); startY = (int) event.getY(); img.setImageBitmap(bitmap); break; } return true; } }); } } 布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.myapplication03.MainActivity"> <ImageView android:id="@+id/img" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="清除" android:id="@+id/btn1"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="红色" android:id="@+id/btn2"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="蓝色" android:id="@+id/btn3"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加粗" android:id="@+id/btn4"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" android:id="@+id/btn5"/> </LinearLayout> </LinearLayout>
记得要在清单文件中添加读写权限否则会报空指针
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>