android實現簡單畫圖功能

0x00 :
模擬Windows畫圖軟件,簡單的畫圖和顏色選擇
0x01 :

package com.itheima.scrawl;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import com.itheima.scrawl.R;

import android.net.Uri;
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.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.Log;
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.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class MainActivity extends Activity implements OnClickListener, OnSeekBarChangeListener, OnTouchListener {

    private static final String logTAG = "MainActivity";
    private Canvas canvas;
    private Matrix matrix;
    private Paint paint;
    private Bitmap blankBitmap;
    private ImageView iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        iv = (ImageView) findViewById(R.id.iv);
        // 1.查找原圖

        // 2.創建拷貝
        //Log.v(logTAG, iv.getHeight() + " # " + iv.getWidth()); //需要等ImageView加載完成才能正確
        blankBitmap = Bitmap.createBitmap(320, 307, Bitmap.Config.ARGB_8888);

        // 3.創建畫布
        canvas = new Canvas(blankBitmap);
        canvas.drawColor(Color.WHITE);

        // 4.
        matrix = new Matrix();

        // 5.
        paint = new Paint();

        // 6.
        canvas.drawBitmap(blankBitmap, matrix, paint);

        findViewById(R.id.btn_Red).setOnClickListener(this);
        findViewById(R.id.btn_Green).setOnClickListener(this);
        findViewById(R.id.btn_Blue).setOnClickListener(this);
        findViewById(R.id.btn_Purple).setOnClickListener(this);
        findViewById(R.id.btn_Yellow).setOnClickListener(this);
        ((SeekBar)findViewById(R.id.sb_PaintWidth)).setOnSeekBarChangeListener(this);

        iv.setOnTouchListener(this);
        paint.setStrokeWidth(5);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);

        return true;
    }

    @Override
    public boolean onMenuItemSelected(int arg0, MenuItem arg1) {
        switch (arg1.getItemId()) {
        case R.id.menuItem_Clear:
            Log.v(logTAG, "清空圖像");
            if (canvas == null || paint == null || matrix == null) {
                Log.v(logTAG, "Clear Bitmap Error!");
                return false;
            }
            canvas.drawColor(Color.WHITE);
            iv.setImageBitmap(blankBitmap);
            break;
        case R.id.menuItem_Save:
            Log.v(logTAG, "Save");
            OutputStream outputstream;
            try {
                File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),  + System.currentTimeMillis() + ".jpg");
                outputstream = new FileOutputStream(file);
                blankBitmap.compress(CompressFormat.JPEG, 100, outputstream);
                outputstream.close();
                // 4.4之後也可以使用!
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
                intent.setData(Uri.fromFile(file));
                sendBroadcast(intent);
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        default:
            Log.v(logTAG, "Menu Error!");
            break;
        }

//      // 4.4之後無法使用!
//      Intent intent = new Intent();
//      intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
//      intent.setData(Uri.parse("file://"));
//      sendBroadcast(intent);



        return super.onMenuItemSelected(arg0, arg1);
    }

    //顏色選擇器的點擊事件
    @Override
    public void onClick(View v) {
        if (paint == null)
            return;
        switch (v.getId()) {
        case R.id.btn_Red:
            paint.setColor(Color.RED);
            Log.v(logTAG, "Red!");
            break;
        case R.id.btn_Green:
            paint.setColor(Color.GREEN);
            Log.v(logTAG, "Green!");
            break;
        case R.id.btn_Blue:
            paint.setColor(Color.BLUE);
            Log.v(logTAG, "Blue!");
            break;
        case R.id.btn_Purple:
            paint.setColor(0xffff00ff);
            Log.v(logTAG, "Purpel!");
            break;
        case R.id.btn_Yellow:
            paint.setColor(Color.YELLOW);
            Log.v(logTAG, "Yellow!");
            break;
        default:
            Log.v(logTAG, "顏色選擇錯誤!");
            break;
        }
    }

    //畫筆粗細的點擊事件
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//      Log.v(logTAG, "onProgressChanged!");
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
//      Log.v(logTAG, "onStartTrackingTouch!");
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        Log.v(logTAG, "onStopTrackingTouch!");
        paint.setStrokeWidth(seekBar.getProgress());

    }

    //畫布的監聽
    float startx = 0;
    float starty = 0;
    float stopx = 0;
    float stopy = 0;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (canvas == null || paint == null || matrix == null) {
            Log.v(logTAG, "init Error!");
            return false;
        }

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            startx = event.getX();
            starty = event.getY();
            stopx = startx;
            stopy = starty;
            break;
        case MotionEvent.ACTION_MOVE:
            startx = stopx;
            starty = stopy;
            stopx = event.getX();
            stopy = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            break;
        default:
            Log.v(logTAG, "獲取焦點失敗!");
            break;
        }

        Log.v(logTAG, startx + " # " + starty + " # " + stopx + " # " + stopy);
        canvas.drawLine(startx, starty, stopx, stopy, paint);
        iv.setImageBitmap(blankBitmap);

        return true;
    }
}

0x03 :
參考:
http://www.jb51.net/article/46023.htm

http://blog.csdn.net/x605940745/article/details/18040027

//當拖動條發生變化時調用該方法
public void onProgressChanged(SeekBar seekBar,int progress,Boolean fromUser)
{System.out.println(progress);}
//當用戶開始滑動滑塊時調用該方法(即按下鼠調用一次)
public void onStartTrackingTouch(SeekBar seekBar){System.out.println(“start:=>”+seekBar.getProgress());}
//當用戶結束對滑塊滑動時,調用該方法(即鬆開鼠標)
 public void onStopTrackingTouch (SeekBar seekBar)
{System.out.println(“stop:=>”+seekBar.getProgress());}}
爲SeekBar綁定監聽器:
seekBar.SetOnSeekBarChangeListener(new SeekBarListener());實現接口時用this代替new SeekBarListener())

http://blog.csdn.net/lsyz0021/article/details/51214082

//要想對菜單項設置點擊事件需要複寫一個方法
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    //獲取當前點擊的菜單項的Id
    switch (item.getItemId()) {
    case R.menu.action_back​:
        Toast.makeText(getApplicationContext(), "後退", 0).show();
        break;
    case R.menu.action_go:
        Toast.makeText(getApplicationContext(), "前進", 0).show();
        break;

    case R.menu.refresh:
        Toast.makeText(getApplicationContext(), "刷新", 0).show();
        break;

    }

    return super.onMenuItemSelected(featureId, item);
}

http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章