普通画板
添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
package Draw; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import com.example.myapp_b.R; public class CanvasActivity extends AppCompatActivity { private ImageView iv; private Bitmap bitmap; private Canvas canvas; private Paint paint; private float startX=0f; private float startY=0f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_canvas); iv=findViewById(R.id.iv); bitmap=Bitmap.createBitmap(1000,1000,Bitmap.Config.ARGB_8888); paint=new Paint(); canvas=new Canvas(bitmap); iv.setImageBitmap(bitmap); iv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action){ case MotionEvent.ACTION_DOWN: //按下时记录点击位置 startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_MOVE: //移动时获取当前位置,并绘制直线 float endX = event.getX(); float endY = event.getY(); canvas.drawLine(startX,startY,endX,endY,paint); iv.setImageBitmap(bitmap); //将直线终点设置为下一次的起点 startX = endX; startY = endY; break; case MotionEvent.ACTION_UP: break; } return true; } }); } public void setColor(View view) { paint.setColor(Color.RED); } public void setWidth(View view) { paint.setStrokeWidth(10); } }
<?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:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="Draw.CanvasActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="设置画笔颜色" android:onClick="setColor"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="设置画笔宽度" android:onClick="setWidth"/> <ImageView android:background="@drawable/bg_border" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv"/> </LinearLayout>
可以选择颜色、宽度、橡皮擦,可以保存文件到本地
添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
file_path.xml
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="DRAW" /> </paths>
package Draw; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import android.app.AlertDialog; import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.icu.text.SimpleDateFormat; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.example.myapp_b.R; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.Date; public class PaintActivity extends AppCompatActivity { private ImageView iv; private Bitmap bitmap; private Canvas canvas; private Paint paint; private float startX=0f; private float startY=0f; private Button bt_back,bt_sure; private ImageView res; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_paint); iv=findViewById(R.id.iv); res=findViewById(R.id.res); bt_back=findViewById(R.id.bt_back); bt_sure=findViewById(R.id.paint_sure); bitmap=Bitmap.createBitmap(1000,1000,Bitmap.Config.ARGB_8888); paint=new Paint(); canvas=new Canvas(bitmap); iv.setImageBitmap(bitmap); iv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action){ case MotionEvent.ACTION_DOWN: //按下时记录点击位置 startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_MOVE: //移动时获取当前位置,并绘制直线 float endX = event.getX(); float endY = event.getY(); canvas.drawLine(startX,startY,endX,endY,paint); iv.setImageBitmap(bitmap); //将直线终点设置为下一次的起点 startX = endX; startY = endY; break; case MotionEvent.ACTION_UP: break; } return true; } }); } int id; public void setColor(View view) { //paint.setColor(Color.RED); id=0; final int [] col={Color.RED,Color.YELLOW,Color.GREEN,Color.BLUE,Color.WHITE,Color.BLACK}; final String []s={"红色","黄色","绿色","蓝色","白色","黑色"}; AlertDialog.Builder DanItem = new AlertDialog.Builder(PaintActivity.this); DanItem.setTitle("选择想要使用的颜色"); DanItem.setSingleChoiceItems(s, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { id =which; } }); DanItem.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which){ ShowMessage("恭喜你选择了"+s[id].toString()); paint.setColor(col[id]); } }); DanItem.create().show(); } private void ShowMessage(String str) { Toast.makeText(PaintActivity.this, str, Toast.LENGTH_LONG).show(); } public void setWidth(View view) { id=0; final int [] w={5,10,15,20,25,30,35,40}; final String []s={"5","10","15","20","25","30"}; AlertDialog.Builder DanItem = new AlertDialog.Builder(PaintActivity.this); DanItem.setTitle("选择想要使用的宽度"); DanItem.setSingleChoiceItems(s, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { id =which; } }); DanItem.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which){ ShowMessage("恭喜你选择了"+s[id]); paint.setStrokeWidth(w[id]); } }); DanItem.create().show(); } public void setErase(View view) { paint.setColor(Color.WHITE); paint.setStrokeWidth(30); } @RequiresApi(api = Build.VERSION_CODES.N) public void savePng(View view) throws FileNotFoundException { System.out.println(saveBitmap(bitmap)); } @RequiresApi(api = Build.VERSION_CODES.N) public String saveBitmap(Bitmap bitmap) { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); Date curDate = new Date(System.currentTimeMillis());//获取当前时间 String str = formatter.format(curDate); String paintPath = ""; str = str + "paint.png"; String imagePath = Environment.getExternalStorageDirectory()+"/DRAW"; File file = new File(imagePath, str); try { FileOutputStream out = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); //保存绘图文件路径 paintPath =file.getAbsolutePath(); /// /storage/emulated/0/DRAW/20211202195458paint.png } catch (FileNotFoundException e) { e.printStackTrace(); } return paintPath; } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context="Draw.PaintActivity"> <RelativeLayout android:layout_width="match_parent" android:orientation="horizontal" android:id="@+id/paint_sum" android:layout_height="wrap_content" tools:ignore="InvalidId"> <Button android:id="@+id/paint_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回" android:textSize="30dp"></Button> <Button android:id="@+id/paint_sure" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:paddingLeft="40dp" android:onClick="savePng" android:text="确定" android:textSize="30dp"></Button> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/paint_sum"> <Button android:id="@+id/bnt_color" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="setColor" android:text="设置画笔颜色" /> <Button android:id="@+id/bnt_width" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/bnt_color" android:onClick="setWidth" android:text="设置画笔宽度" tools:ignore="UnknownId" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/erase" android:text="橡皮擦" android:onClick="setErase" android:layout_toRightOf="@id/bnt_color" ></Button> <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/bnt_width" /> </RelativeLayout> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:id="@+id/res" ></ImageView> </RelativeLayout>