歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android利用canvas畫畫板

Android利用canvas畫畫板,首先新建一個項目工程,建立文件,如下圖所示

首先配置頁面布局文件activity_main.xml,如下圖所示:

<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">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bg"
        />
    <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="畫筆的粗細"
        />
    <SeekBar
        android:id="@+id/sb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="256"
        />
    <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="顏色"
        />
    <Spinner
        android:id="@+id/sp"
        android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:entries="@array/color"
        />
    <Button
            android:id="@+id/btn"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="保存"
        />
 
   

</LinearLayout>

然後書寫主頁的代碼MainActivity.java代碼如下

package com.xunfang.drawing;

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

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.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.MonthDisplayHelper;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.Toast;


public class MainActivity extends Activity {
    private SeekBar sb;
    private ImageView iv;
    private Button btn;
    private Spinner sp;
    private String[] color ;
   
    private Bitmap bm;
    private Bitmap copy;
    private  Canvas canvas;
    private Paint paint;
    private File file;
    private int yanse;
       
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
      //拿到在xml文件中定義的顏色數組
        color = getResources().getStringArray(R.array.color) ;
        //實例化
        initData();
        //設置監聽器
        setLister();
        //畫畫
        loadingImage();
       
    }
    private void loadingImage() {
        // 加載原始圖片
        bm = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
        // 需要創建一個和原始的圖片大小一樣的空白圖片(一張紙,上面沒有任何數據)
        copy = bm.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
        // 需要一個畫板,畫板上鋪上白紙
        canvas= new Canvas(copy);
        // 創建畫筆
        paint= new Paint();
       
        // 給imageView空間加載一個滑動監聽器
        iv.setOnTouchListener(new OnTouchListener() {
            int startx;
            int starty;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // 拿到動作
                int type = event.getAction();
                switch (type) {
                case MotionEvent.ACTION_DOWN:
                    startx = (int) event.getX();
                    starty = (int) event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    int endx = (int) event.getX();
                    int endy = (int) event.getY();
                    //畫畫
                    canvas.drawLine(startx, starty, endx, endy, paint);
                    startx = (int) event.getX();
                    starty = (int) event.getY();
                    iv.setImageBitmap(copy);
                    break;
                case MotionEvent.ACTION_UP:
                   
                    break;
                }
                return true;
            }
        });
       
    }
    private void setLister() {
        //下拉框
        sp.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                Toast.makeText(getApplicationContext(), "你點擊的是:" +  color[position], 0).show();               
                switch (position) {
                case 1:
                    paint.setColor(Color.GREEN);
                    break;
                case 2:
                    paint.setColor(Color.BLUE);
                    break;
                case 3:
                    paint.setColor(Color.BLACK);
                    break;
                case 4:
                    paint.setColor(Color.YELLOW);
                    break;
                case 0:
                    paint.setColor(Color.RED);
                    break;
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
        //保存
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    //指定圖片的存儲路徑
                    file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile()+"/draw.png");
                    FileOutputStream fos = new FileOutputStream(file);
                    copy.compress(CompressFormat.PNG, 100, fos);
                    Toast.makeText(getApplicationContext(), "保存成功", 0).show() ;
                } catch (Exception e) {
                }
                //欺騙系統,告訴系統插入一個sd卡
                Intent intent = new Intent();
                intent.setAction(intent.ACTION_MEDIA_MOUNTED);
                intent.setData(Uri.fromFile(file));
                sendBroadcast(intent);
            }
        });
    }
    private void initData() {
            sb = (SeekBar) findViewById(R.id.sb);
            btn = (Button) findViewById(R.id.btn);
            sp = (Spinner) findViewById(R.id.sp);
            iv = (ImageView) findViewById(R.id.iv);
    }


}

AndroidManifest.xml配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xunfang.drawing"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

然後用虛擬機測試如下所示:

可以在模擬器看一下,生成的文件

表示驗證成功了

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved