效果圖
程序的邏輯就是我們點擊按鈕就調用系統相冊,然後再我們選擇了相應的圖片後,我們調用系統的裁剪圖片的功能來進行圖片的裁剪,再然後我們將裁剪後的圖片獲得,然後對其進行設置顯示的樣式,最後以圓形顯示出來就好了。
這種功能在我們很多程序中都有見到,最多的就是讓我們設置用戶的頭像的時候,選擇本地圖片來設置。那我們來看看程序的代碼實現吧。
佈局就簡單的一個按鈕和一個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繪製在一起,這樣就不需要分順序了,怎麼繪製都可以得到圓形的圖片內容。
- 研究好久也沒搞懂,不知道是我代碼的問題還是其他,如果哪位博友知道的話,還請指正,十分感謝。