實踐--調用系統相冊,裁剪圖片並設置圓形顯示

  • 效果圖
    這裏寫圖片描述

  • 程序的邏輯就是我們點擊按鈕就調用系統相冊,然後再我們選擇了相應的圖片後,我們調用系統的裁剪圖片的功能來進行圖片的裁剪,再然後我們將裁剪後的圖片獲得,然後對其進行設置顯示的樣式,最後以圓形顯示出來就好了。

  • 這種功能在我們很多程序中都有見到,最多的就是讓我們設置用戶的頭像的時候,選擇本地圖片來設置。那我們來看看程序的代碼實現吧。

  • 佈局就簡單的一個按鈕和一個ImageView,這裏就不再貼出來了。

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button button;
    private ImageView imageView;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        button= (Button) findViewById(R.id.button);
        imageView= (ImageView) findViewById(R.id.imageView);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                Intent intent=new Intent();
                //獲取文件的類型,image/*表示就是圖片
                intent.setType("image/*");
                //下面是打開系統相冊的Action
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(intent,1);
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode!=RESULT_CANCELED){
            switch (requestCode){
                case 1:
                    //從相冊中選取的圖片的uri保存在data中
                    startPhotoZoom(data.getData());
                    break;
                case 2:
                    //截取完的圖片數據存放在類型爲intent的data中
                    viewToImage(data);
            }
        }
    }

    private void viewToImage(Intent data) {
        //姐去玩的圖片數據存放在類型爲intent的data中
        Bundle bundle=data.getExtras();
        if (bundle!=null){
            Bitmap bitmap=bundle.getParcelable("data");
            Bitmap bitmap_bg=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas=new Canvas(bitmap_bg);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setColor(Color.GREEN);
            //這裏使用了繪圖的模式的功能,在上一篇博客有講,PorterDuff.Mode.SRC_IN表示兩個圖層顯示重合部分上面圖層的內容
            canvas.drawOval(new RectF(0,0,bitmap.getWidth(),bitmap.getHeight()),paint);
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(bitmap,0,0,paint);
            imageView.setImageBitmap(bitmap_bg);
        }else {
            Toast.makeText(MainActivity.this, "數據爲空", Toast.LENGTH_SHORT).show();
        }
    }

    private void startPhotoZoom(Uri uri) {
        //這是進行系統裁剪功能的Action
        Intent intent=new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri,"image/*");
        //設置裁剪
        intent.putExtra("crop","true");
        //設置裁剪寬高的比例
        intent.putExtra("aspectX",1);
        intent.putExtra("aspectY",1);
        //自由截取的方法,默認就是自由截圖
//        intent.putExtra("scale",true);
        //設置圖片的輸出尺寸
        intent.putExtra("outputX", 320);
        intent.putExtra("outputY", 320);
        //將截取的圖片返回回來,如果不屑、寫這句話,默認將截取的圖片保存到源目錄
        intent.putExtra("return-data", true);
        startActivityForResult(intent,2);
    }
}

請注意這裏的代碼

            canvas.drawOval(new RectF(0,0,bitmap.getWidth(),bitmap.getHeight()),paint);
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(bitmap,0,0,paint);
  • 可以看到這裏我是先繪製的一個圓形,在繪製的圖片的bitmap,這裏的順序只能這樣繪製,具體原因我也沒搞清,如果先畫bitmap在畫原型,那麼PorterDuff.Mode.SRC_IN的設置就不會有效果,不知道爲什麼。
  • 還有一種方式就是我不繪製圖形,我再創建一個bitmap和圖像bitmap繪製在一起,這樣就不需要分順序了,怎麼繪製都可以得到圓形的圖片內容。
  • 研究好久也沒搞懂,不知道是我代碼的問題還是其他,如果哪位博友知道的話,還請指正,十分感謝。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章