Android组件学习笔记(简易绘画板)

自学Android中,根据一位前辈的代码进行学习,理解,在其基础上做了一些改进

功能简述:1,画图2.清空3.改变画笔大小4.全屏渲染5.改变颜色

初始界面是一张图片,下载需注意一下

样例图片:



源代码:

package com.example.hp.jingdutiao;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.SeekBar;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewSwitcher;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    private List<String> list = new ArrayList<String>();//下选框存储内容
    private TextView myTextView;
    private Spinner mySpinner;//下选框
    private ArrayAdapter<String> adapter;//下选框适配器

    private ImageView iv;
    private Bitmap baseBitmap;
    private Button btn_resume;
    private Button btn_save;
    private Canvas canvas;//画布
    private Paint paint;//画笔
    private CheckBox checkBox;
    float radio;
    String color="RED";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        list.add("红色");list.add("绿色");list.add("蓝色");list.add("黄色");list.add("白色");list.add("黑色");list.add("灰色");
        list.add("画笔:大");list.add("画笔:中");list.add("画笔:小");list.add("画笔:极小");list.add("画笔:极大");
        checkBox=(CheckBox)findViewById(R.id.checkBox);
        mySpinner = (Spinner)findViewById(R.id.spinner);
        iv = (ImageView) findViewById(R.id.iv);// 初始化一个画笔,笔触宽度为5,颜色为红色
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list);//设置适配器
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mySpinner.setAdapter(adapter);

        iv.setImageResource(R.drawable.pics);

        radio = 5;
        paint = new Paint();
        paint.setStrokeWidth(radio);
        paint.setColor(Color.RED);//初始化最初的画笔为红色

        mySpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                color=adapter.getItem(arg2);

                if(color.equals("红色")) paint.setColor(Color.RED);
                else if(color.equals("绿色")) paint.setColor(Color.GREEN);
                else if(color.equals("蓝色")) paint.setColor(Color.BLUE);
                else if(color.equals("黄色")) paint.setColor(Color.YELLOW);
                else if(color.equals("白色")) paint.setColor(Color.WHITE);
                else if(color.equals("黑色")) paint.setColor(Color.BLACK);
                else if(color.equals("灰色")) paint.setColor(Color.GRAY);
                else if(color.equals("画笔:极大"))radio=50;
                else if(color.equals("画笔:大"))radio=30;
                else if (color.equals("画笔:中"))radio=20;
                else if(color.equals("画笔:小"))radio=5;
                else if(color.equals("画笔:极小"))radio=3;
                Toast.makeText(MainActivity.this, "注意,调节画笔大小即为默认为使用画笔,调整为"
                        +adapter.getItem(arg2), Toast.LENGTH_SHORT).show();
            }
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });



        iv = (ImageView) findViewById(R.id.iv);
        btn_resume = (Button) findViewById(R.id.btn_resume);
        btn_save = (Button) findViewById(R.id.btn_save);


        btn_resume.setOnClickListener(click);//设置按钮事件
        btn_save.setOnClickListener(click);
        iv.setOnTouchListener(touch);//设置触屏事件
    }
    private View.OnTouchListener touch = new View.OnTouchListener() {
        float startX,startY;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {// 用户按下动作
                case MotionEvent.ACTION_DOWN:// 第一次绘图初始化内存图片,指定背景为白色
                    if(checkBox.isChecked())
                    {
                        if (baseBitmap == null) {
                            baseBitmap = Bitmap.createBitmap(iv.getWidth(), iv.getHeight(), Bitmap.Config.ARGB_8888);
                            canvas = new Canvas(baseBitmap);
                            if (color.equals("红色")) canvas.drawColor(Color.RED);
                            else if (color.equals("绿色")) canvas.drawColor(Color.GREEN);
                            else if (color.equals("蓝色")) canvas.drawColor(Color.BLUE);
                            else if (color.equals("黄色")) canvas.drawColor(Color.YELLOW);
                            else if (color.equals("白色")) canvas.drawColor(Color.WHITE);
                            else if (color.equals("黑色")) canvas.drawColor(Color.BLACK);
                            else if (color.equals("灰色")) canvas.drawColor(Color.GRAY);
                            Toast.makeText(MainActivity.this, "请滑动实现渲染", Toast.LENGTH_SHORT).show();
                        }
                        else
                        {
                            if (color.equals("红色")) canvas.drawColor(Color.RED);
                            else if (color.equals("绿色")) canvas.drawColor(Color.GREEN);
                            else if (color.equals("蓝色")) canvas.drawColor(Color.BLUE);
                            else if (color.equals("黄色")) canvas.drawColor(Color.YELLOW);
                            else if (color.equals("白色")) canvas.drawColor(Color.WHITE);
                            else if (color.equals("黑色")) canvas.drawColor(Color.BLACK);
                            else if (color.equals("灰色")) canvas.drawColor(Color.GRAY);
                            Toast.makeText(MainActivity.this, "请滑动实现渲染", Toast.LENGTH_SHORT).show();
                        }
                    }
                    else
                    {
                        if (baseBitmap == null) {
                            baseBitmap = Bitmap.createBitmap(iv.getWidth(), iv.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(),stopY = event.getY();
                    Thread t =new Thread(new Runnable() {
                        @Override
                        public void run() {
                            radio+=0.1;
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    t.start();
                    paint.setStrokeWidth(radio);//根据两点坐标,绘制连线
                    canvas.drawLine(startX, startY, stopX, stopY, paint);// 更新开始点的位置
                    startX = event.getX();startY = event.getY();// 把图片展示到ImageView中
                    iv.setImageBitmap(baseBitmap);
                    break;
                case MotionEvent.ACTION_UP:break;
                default:break;
            }
            return true;
        }

    };
    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;
            }
        }
    };
    protected void saveBitmap() {
        try {
            // 保存图片到SD卡上
            String fileName = "/sdcard/"+System.currentTimeMillis() + ".jpg";
            File file = new File(fileName);
            FileOutputStream stream = new FileOutputStream(file);
            baseBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            Toast.makeText(this, "保存图片成功", Toast.LENGTH_SHORT).show();
//             // Android设备Gallery应用只会在启动的时候扫描系统文件夹
//             // 这里模拟一个媒体装载的广播,用于使保存的图片可以在Gallery中查看
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
            intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
            sendBroadcast(intent);
        } catch (Exception e) {
            Toast.makeText(this, "保存图片失败", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }// 手动清除画板的绘图,重新创建一个画板
    protected void resumeCanvas() {
        if (baseBitmap != null) {
            baseBitmap = Bitmap.createBitmap(iv.getWidth(), iv.getHeight(), Bitmap.Config.ARGB_8888);
            canvas = new Canvas(baseBitmap);
            canvas.drawColor(Color.WHITE);//设置画板 :清空
            iv.setImageBitmap(baseBitmap);
            Toast.makeText(this, "清除画板成功,可以重新开始绘图", Toast.LENGTH_SHORT).show();
        }
    }
}
布局代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="com.example.hp.jingdutiao.MainActivity">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:weightSum="1"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp">

        <ImageView
            android:id="@+id/iv"
            android:layout_width="match_parent"
            android:layout_height="208dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_weight="1" />

        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Spinner
                android:id="@+id/spinner"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_above="@+id/btn_resume"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_weight="1" />

            <CheckBox
                android:id="@+id/checkBox"
                android:layout_width="101dp"
                android:layout_height="wrap_content"
                android:checked="false"
                android:text="渲染全屏" />

            <Button
                android:id="@+id/btn_save"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignBottom="@+id/linearLayout4"
                android:layout_toRightOf="@+id/linearLayout4"
                android:layout_weight="1"
                android:text="保存" />

            <Button
                android:id="@+id/btn_resume"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_weight="1"
                android:text="重绘" />

        </LinearLayout>
    </LinearLayout>

</android.support.constraint.ConstraintLayout>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值