製作一個簡單的畫板

這個畫板可以實現簡單的繪圖功能,可以設置畫筆的顏色,可以設置畫刷,演示效果如下圖所示



點擊保存按鈕後可以將畫好的圖片保存在本地,並且在本相冊中可以看到保存在本地的圖片



實現方式:

第一步:使用Android Studio創建一個android工程,並且在drawable文件夾中放一張圖片作爲畫畫板的背景



第二步:修改activity_main.xml文件

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/bg" />

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

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="紅色"
            android:onClick="red" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="綠色"
            android:onClick="green" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="刷子"
            android:onClick="brush" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="保存"
            android:onClick="save" />

    </LinearLayout>

</RelativeLayout>


第三步:修改MainActivity.java文件
package com.fyt.drawingboard;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView iv;

    //用於記錄觸摸點的座標
    int startX;
    int startY;

    //用於創建畫板
    private Canvas canvas;

    //用於創建畫筆
    private Paint paint;

    //用於創建圖片副本
    private Bitmap bmCopy;

    private File file;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //加載佈局文件
        setContentView(R.layout.activity_main);

        //加載畫板的背景圖
        Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);

        //創建圖片副本,實際上是創建一張白紙
        bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());

        //創建畫筆
        paint = new Paint();

        //創建一個畫板,並且將白紙鋪在畫板上
        canvas = new Canvas(bmCopy);

        //繪製
        canvas.drawBitmap(bmSrc, new Matrix(), paint);

        //獲得佈局文件上的ImageView控件
        iv = (ImageView) findViewById(R.id.iv);

        //將圖片副本放到ImageView控件中
        //實際上將白紙放到ImageView控件中
        iv.setImageBitmap(bmCopy);

        //設置觸摸偵聽
        iv.setOnTouchListener(new OnTouchListener() {

            //觸摸屏幕時,觸摸事件產生時,此方法調用
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                //獲得手指觸摸屏幕時的動作
                int action = event.getAction();

                switch (action) {

                    //用戶的手指剛觸摸到屏幕
                    case MotionEvent.ACTION_DOWN:

                        //獲得觸摸點的座標
                        startX = (int) event.getX();
                        startY = (int) event.getY();
                        break;

                    //用戶的手指在屏幕上滑動
                    case MotionEvent.ACTION_MOVE:

                        //獲得觸摸點的位置
                        int x = (int) event.getX();
                        int y = (int) event.getY();

                        //繪製直線
                        canvas.drawLine(startX, startY, x, y, paint);

                        //每次繪製完畢之後,本次繪製的結束座標變成下一次繪製的初始座標
                        startX = x;
                        startY = y;

                        iv.setImageBitmap(bmCopy);
                        break;

                    //用戶手指離開屏幕
                    case MotionEvent.ACTION_UP:
                        break;

                }

                //true:告訴系統,這個觸摸事件由我來處理
                //false:告訴系統,這個觸摸事件我不處理,這時系統會把觸摸事件傳遞給imageview的父節點
                return true;
            }
        });


    }

    //紅色按鈕響應函數
    public void red(View v) {

        //設置畫筆的顏色爲紅色
        paint.setColor(Color.RED);
    }

    //綠色按鈕響應函數
    public void green(View v) {

        //設置畫筆的顏色爲綠色
        paint.setColor(Color.GREEN);
    }

    //畫刷按鈕響應函數
    public void brush(View v) {

        //將畫筆變成畫刷
        paint.setStrokeWidth(7);
    }

    //保存按鈕響應函數
    public void save(View v) {

        //創建File對象,並且將文件的保存路徑設置爲sdcard/dazuo.png
        file = new File("sdcard/dazuo.png");

        //定義變量用於創建文件輸出流對象
        FileOutputStream fos = null;

        try {

            //創建文件輸出流對象
            fos = new FileOutputStream(file);
        } catch (FileNotFoundException e) {

            e.printStackTrace();
        }

        //壓縮圖片
        bmCopy.compress(CompressFormat.PNG, 100, fos);

        //如果Android的版本是4.4或者以上的版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        {
            //掃描SD卡下的圖片
            Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            Uri contentUri = Uri.fromFile(file);
            mediaScanIntent.setData(contentUri);
            this.sendBroadcast(mediaScanIntent);
        }
        //Android版本在4.4以下
        else
        {
            //發送sd卡就緒廣播,用來掃描SD卡下的圖片
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
            intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
            sendBroadcast(intent);
        }
    }
}


最後一步:在配置文件中添加幾條權限

  <!--對SD卡的寫權限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!--對SD卡的讀取權限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章