編輯:關於Android編程
首先講述這個小項目的特色:
1、調用系統的相冊應用獲取單張圖片
2、對單張圖片進行剪切方便做成指定大小的頭像圖片
3、對獲取圖片的結果進行解析,使用三種方式進行。
首先看看效果圖:
打開app,進入注界面,點擊獲取圖片按鈕
調用系統的圖片選擇器,選擇圖庫,
點擊圖片,返回獲取到圖片
點擊剪切圖片按鈕,調用系統的圖片剪切工具
獲取到剪切之後的圖片
下面具體請看代碼:
public class MainActivity extends Activity implements OnClickListener{
private TextView backTx,sureTx;//一個返回鍵,一個確定鍵
private ImageView imageView;//顯示獲取的圖片的ImageView
private Button getPic,getPic2Cut;
//兩個按鈕,分別實現獲取圖片、對圖片進行剪切
private final int REQUEST = 11;//獲取圖片的請求值
private final int HEAD_IMAGE_ZOOM = 12;//圖片剪切的請求值
private Uri uri;
private String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
init();
setclickListener();
}
private void init(){
backTx = (TextView) findViewById(R.id.cancle);
sureTx = (TextView) findViewById(R.id.ok);
imageView = (ImageView) findViewById(R.id.image);
getPic = (Button) findViewById(R.id.get_pic);
getPic2Cut = (Button) findViewById(R.id.get_pic_to_cut);
}
private void setclickListener(){
backTx.setOnClickListener(this);
sureTx.setOnClickListener(this);
getPic.setOnClickListener(this);
getPic2Cut.setOnClickListener(this);
}
//調用系統相冊獲取圖片的方法,非常簡單
private void loadData(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(image/*);
startActivityForResult(intent, REQUEST);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.cancle:
finish();
break;
case R.id.ok:
Toast.makeText(MainActivity.this, 圖片已經獲取到, Toast.LENGTH_SHORT).show();
break;
case R.id.get_pic:
loadData();
break;
case R.id.get_pic_to_cut:
startPhotoZoom(uri);
break;
}
}
@SuppressWarnings(deprecation)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST && resultCode == RESULT_OK) {
uri = data.getData();
/**
* 方法一:
* 直接使用ImageView的方法設置圖片地址URI即可。
* 不過這種方式當圖片很大的時候,容易出現OOM異常,慎用!
*/
imageView.setImageURI(uri);
/**
* 方法二:
* 根據獲取的URI進行查詢,獲取到圖片後進行縮放,不會出現OOM異常
*/
Cursor cursor = managedQuery(uri, null, null, null, null);
if (cursor != null) {
Log.i(TAG, 記錄數=+cursor.getCount());
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndexOrThrow(Media.DATA);
String path = cursor.getString(index);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
imageView.setImageBitmap(bitmap);
}
}else {
Toast.makeText(MainActivity.this, 無法獲取圖片數據, Toast.LENGTH_SHORT).show();
}
/**
* 方法三:
* 由於managedQuery這個方法已經不再推薦使用
* 故使用CursorLoader類完成查詢操作
*/
CursorLoader cursorLoader = new CursorLoader(MainActivity.this,
uri, null, null, null, null);
Cursor cursor2 = cursorLoader.loadInBackground();
if (cursor2 != null) {
Log.i(TAG, 記錄數=+cursor2.getCount());
if (cursor2.moveToFirst()) {
int index = cursor2.getColumnIndexOrThrow(Media.DATA);
String path = cursor2.getString(index);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
imageView.setImageBitmap(bitmap);
}
}else {
Toast.makeText(MainActivity.this, 無法獲取圖片數據, Toast.LENGTH_SHORT).show();
}
}else if (requestCode == HEAD_IMAGE_ZOOM && resultCode == RESULT_OK) {
Bundle bundle = data.getExtras();
if (bundle != null) {
Bitmap bitmap = bundle.getParcelable(data);
imageView.setImageBitmap(bitmap);
}else {
Toast.makeText(MainActivity.this, 圖片剪切失敗, Toast.LENGTH_SHORT).show();
}
}else if (requestCode == HEAD_IMAGE_ZOOM) {
Toast.makeText(MainActivity.this, 圖片取消剪切, Toast.LENGTH_SHORT).show();
}
}
/**
* 調用系統的程序進行圖片的剪切操作
* 獲取指定大小的剪切圖片,方便做成頭像
* @param uri
*/
private void startPhotoZoom(Uri uri) {
Intent intent = new Intent(com.android.camera.action.CROP);
intent.setDataAndType(uri, image/*);
// 下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪
intent.putExtra(crop, true);
// aspectX aspectY 是寬高的比例
intent.putExtra(aspectX, 1);
intent.putExtra(aspectY, 1);
// outputX outputY 是裁剪圖片寬高
intent.putExtra(outputX, 80);
intent.putExtra(outputY, 80);
intent.putExtra(return-data, true);
startActivityForResult(intent, HEAD_IMAGE_ZOOM);
}
}
上面代碼獲取返回值的過程中,使用了三種方法,具體實現的時候只是用一種方法即可。推薦使用第三種方式。
值得一提的是,該小項目需要在配置文件中加入一下權限值:
沒有此權限則報錯!
該小項目非常實用,大部分app中都有獲取用戶頭像、進行用戶頭像的設置的操作,所以大家可以參考,如果有什麼不對的地方,請大家積極留言交流,共同進步!謝謝~!【握手】
說明本文可能需要一些基礎知識點,如Canvas,Paint,Path,Rect等類的基本使用,建議不熟悉的同學可以學習GcsSloop安卓自定義View教程目錄,會幫助很
要實現一個圖靈機器人,首先需要在 http://www.tuling123.com/ 中注冊,然後創建一個應用,便可通過應用的API key使用圖靈機器人。圖靈機器人非常
第十八章、代理模式 代理模式也稱委托模式,是結構型設計模式之一。是應用廣泛的模式之一。1.定義為其他對象提供一種代理以控制對這個對象的訪問。2.使用場景當無法或不想直接訪
在Launcher3中,有三處長按拖拽處理:主屏幕(Workspace)上的圖標和小部件文件夾中的圖標抽屜中的圖標和小部件這三種情況的拖拽處理是相似的的,我們只需知道其中