最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

【安卓开发】Android实现画板

IT圈 admin 4浏览 0评论

【安卓开发】Android实现画板

普通画板

添加权限

<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;@Overrideprotected 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() {@Overridepublic 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=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="Draw.CanvasActivity"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="设置画笔颜色"android:onClick="setColor"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="设置画笔宽度"android:onClick="setWidth"/><ImageViewandroid: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=""><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.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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {id =which;}});DanItem.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {id =which;}});DanItem.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic 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);bitmappress(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=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context="Draw.PaintActivity"><RelativeLayoutandroid:layout_width="match_parent"android:orientation="horizontal"android:id="@+id/paint_sum"android:layout_height="wrap_content"tools:ignore="InvalidId"><Buttonandroid:id="@+id/paint_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="返回"android:textSize="30dp"></Button><Buttonandroid: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><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/paint_sum"><Buttonandroid:id="@+id/bnt_color"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="setColor"android:text="设置画笔颜色" /><Buttonandroid: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" /><Buttonandroid: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><ImageViewandroid:id="@+id/iv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/bnt_width" /></RelativeLayout><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:id="@+id/res"></ImageView>
</RelativeLayout>

【安卓开发】Android实现画板

普通画板

添加权限

<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;@Overrideprotected 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() {@Overridepublic 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=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="Draw.CanvasActivity"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="设置画笔颜色"android:onClick="setColor"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="设置画笔宽度"android:onClick="setWidth"/><ImageViewandroid: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=""><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.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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {id =which;}});DanItem.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {id =which;}});DanItem.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic 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);bitmappress(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=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context="Draw.PaintActivity"><RelativeLayoutandroid:layout_width="match_parent"android:orientation="horizontal"android:id="@+id/paint_sum"android:layout_height="wrap_content"tools:ignore="InvalidId"><Buttonandroid:id="@+id/paint_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="返回"android:textSize="30dp"></Button><Buttonandroid: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><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/paint_sum"><Buttonandroid:id="@+id/bnt_color"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="setColor"android:text="设置画笔颜色" /><Buttonandroid: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" /><Buttonandroid: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><ImageViewandroid:id="@+id/iv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/bnt_width" /></RelativeLayout><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:id="@+id/res"></ImageView>
</RelativeLayout>

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论