【Android】用Android写个自己的画板APP

1.常规操作,创建项目

[外

2.清单文件给权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.canvas">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Map">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvtFTYIc-1652364651356)(https://juejin.cn/ “点击并拖拽以移动”)]

3.布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="5dp"
    android:paddingTop="5dp"
    android:paddingRight="5dp"
    android:paddingBottom="5dp"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_resume"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="重新画图" />
        <Button
            android:id="@+id/btn_save"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="保存图片" />
    </LinearLayout>
    <ImageView
        android:id="@+id/iv_canvas"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

4.主活动

package com.example.canvas;

import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
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.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;

public class MainActivity extends AppCompatActivity {
    private Button btn_save,btn_resume;
    private ImageView iv_canvas;
    private Bitmap baseBitmap;
    private Canvas canvas;
    private Paint paint;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化画笔
        paint = new Paint();
        paint.setStrokeWidth(5);
        paint.setColor(Color.RED);

        iv_canvas = findViewById(R.id.iv_canvas);
        btn_save = findViewById(R.id.btn_save);
        btn_resume = findViewById(R.id.btn_resume);

        btn_save.setOnClickListener(click);
        btn_resume.setOnClickListener(click);
        iv_canvas.setOnTouchListener(touch);//屏幕触摸事件监听器
    }
    private View.OnClickListener click = new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_save:
                    saveBitmap();
                    break;
                case R.id.btn_resume:
                    resumeCanvas();
                    break;
                default:
                    break;
            }
        }
    };
    private View.OnTouchListener touch = new View.OnTouchListener() {
        //定义手指开始触屏的坐标
        float startX;
        float startY;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    if(baseBitmap==null){
                        baseBitmap = Bitmap.createBitmap(iv_canvas.getWidth(),iv_canvas.getHeight(),Bitmap.Config.ARGB_8888);
                        canvas = new Canvas(baseBitmap);
                        canvas.drawColor(Color.WHITE);
                    }
                    startX = event.getX();
                    startY = event.getY();
                    break;
                //手指在屏幕上移动的动作
                case MotionEvent.ACTION_MOVE:
                    //记录移动位置上移动的动作
                    float stopX = event.getX();
                    float stopY = event.getY();
                    //根据两点坐标,绘制连线
                    canvas.drawLine(startX,startY,stopX,stopY,paint);
                    //更新开始点的位置
                    startX = event.getX();
                    startY = event.getY();
                    //把图片展示到ImageView中
                    iv_canvas.setImageBitmap(baseBitmap);
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                default:
                    break;
            }
            return true;
        }
    };


    //保存到SD卡
    protected  void saveBitmap(){
        try{
        File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis() + ".png");
         FileOutputStream stream = new FileOutputStream(file);
         baseBitmap.compress(Bitmap.CompressFormat.PNG,100,stream);
            Toast.makeText(MainActivity.this, "保存图片成功", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
            intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
            sendBroadcast(intent);
        }catch (Exception e){
            Toast.makeText(MainActivity.this, "保存图片失败", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }
    protected void resumeCanvas(){
        if(baseBitmap != null){
            baseBitmap = Bitmap.createBitmap(iv_canvas.getWidth(),iv_canvas.getHeight(),Bitmap.Config.ARGB_8888);
            canvas = new Canvas(baseBitmap);
            canvas.drawColor(Color.WHITE);
            iv_canvas.setImageBitmap(baseBitmap);
            Toast.makeText(MainActivity.this, "清除画板成功 重新绘画", Toast.LENGTH_SHORT).show();
        }
    }
}

5.运行,记得在虚拟机给应用权限


6.可以使用你自己的应用了


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你需要在 Android 应用中实现标签画板功能,对吗?那么,你可以遵循以下步骤: 1. 创建一个画布布局 在你的 XML 布局文件中创建一个画布,这个画布将用于绘制标签。你可以使用 `Canvas` 类来实现这个画布。 ``` <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY"/> <View android:id="@+id/drawing_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> ``` 2. 创建绘图类 创建一个 `DrawingView` 类,这个类将实现标签的绘制功能。在这个类中,你需要重写 `onDraw()` 方法,这个方法会在每次绘制时调用。在这个方法中,你可以使用 `Canvas` 对象来绘制标签。 ``` public class DrawingView extends View { private Paint paint; private Path path; private List<Path> paths; public DrawingView(Context context) { super(context); init(); } public DrawingView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5f); path = new Path(); paths = new ArrayList<>(); paths.add(path); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (Path path : paths) { canvas.drawPath(path, paint); } } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(x, y); return true; case MotionEvent.ACTION_MOVE: path.lineTo(x, y); break; case MotionEvent.ACTION_UP: path = new Path(); paths.add(path); break; default: return false; } invalidate(); return true; } } ``` 3. 在 Activity 中使用绘图类 在你的 Activity 中,获取 `DrawingView` 对象,并将其添加到布局中。 ``` public class MainActivity extends AppCompatActivity { private DrawingView drawingView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawingView = findViewById(R.id.drawing_view); } } ``` 现在,你的应用就可以使用标签画板功能了。当你在画布上绘制时,会出现红色的线条。你可以使用其他颜色和线条宽度来自定义绘制效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值