Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android自定義View——Bitmap使用詳解

android自定義View——Bitmap使用詳解

編輯:關於Android編程

先看一個效果圖
這裡寫圖片描述

本節課程實現完成右圖效果(三步)以及保存塗鴉過的圖片


步驟【1】將背景Bitmap圖片畫到底層canvas上

 bitmapBackground = BitmapFactory.decodeResource(getResources(), R.mipmap.cc);

   //把背景圖 畫到底層,在底層摳圖全屏大小,將原圖放大後匹配到摳圖上面
        canvas.drawBitmap(bitmapBackground, new Rect(0, 0, bitmapBackground.getWidth(), bitmapBackground.getHeight()), new Rect(0, 0, width, height), null);

這一步驟涉及到自定義View屬性問題參考上一篇:
http://blog.csdn.net/taoolee/article/details/48547781:即背景圖可以在XML當中定義

步驟【2】在新建的Bitmap畫布上 加上蒙版

//第二層為一個位圖的圖層;在此圖層上給圖片加上蒙版,
canvasBit.drawRect(0, 0, width, height, paintCircle);

步驟【3】設置畫筆路徑,使得重疊的部分透明

這裡有個問題就是,當筆觸在屏幕上快速滑動的話,中間連接不起來所以解決這個問題

  private Path path;
    float x;
    float y;
    float old_x;
    float old_y;

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x = event.getX();
                y = event.getY();
                path.moveTo(x, y);
                invalidate();
                old_x = x;
                old_y = y;
                return true;


            case MotionEvent.ACTION_MOVE:
                x = event.getX();
                y = event.getY();
                path.moveTo(old_x, old_y);
                path.lineTo(x, y);
                //也可以通過畫貝塞爾曲線實現
                // path.quadTo((x+old_x)/2,(y+old_y)/2,x,y);


                //畫圓的畫,快速滑動中間會不連貫
                //path.addCircle(x, y, 50, Path.Direction.CW);
                invalidate();
                old_x = x;
                old_y = y;
                return true;


        }


        return super.onTouchEvent(event);
    }

關於圖層

在這裡給講解一下圖層的問題,大體上算是我個人的理解,首先onDraw()方法自帶一個canvas,我理解為他是手機屏幕。最後我們都要使用這塊畫布
把其他的東西在這上面展示出來:在這裡我們新建了一個位圖圖層,它的作用就是先畫一層蒙版,再畫一個路徑,,是的重疊部分透明,我們就是為了得到這個透明的東西,然後把我們得到的這個透明的,最後也要畫在onDraw()方法裡面的canvas上面;
新建的Bitmap的畫布

//創建一個寬width高height的新位圖
        back = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        canvasBit = new Canvas(back);//位圖傳遞給它的畫布
  //把背景圖 畫到底層,在底層摳圖全屏大小,將原圖放大後匹配到摳圖上面
        canvas.drawBitmap(bitmapBackground, new Rect(0, 0, bitmapBackground.getWidth(), bitmapBackground.getHeight()), new Rect(0, 0, width, height), null);
        //第二層為一個位圖的圖層;在此圖層上給圖片加上蒙版,
        canvasBit.drawRect(0, 0, width, height, paintCircle);

        canvasBit.drawPath(path, paintRect);//與上層重疊透明
        //最後都要在canvas上面畫上去
        canvas.drawBitmap(back, 0, 0, null);

保存圖片

實現將塗鴉的位圖保存到本地,格式比較固定,大家看一些

public class MainActivityBitmap2 extends Activity  {

    private MyBitmapView2 view2;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bitmapview2);
        view2= (MyBitmapView2) findViewById(R.id.view2);
        button= (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                view2.setDrawingCacheEnabled(true);
                Bitmap bit=view2.getDrawingCache(true);
                File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+.jpg);
                if(!file.exists()){
                    try {
                        file.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    bit.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(file));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }


            }
        });

    }
}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved