編輯:關於Android編程
目前幾乎所有的APP在用戶注冊時都會有設置頭像的需求,大致分為三種情況:
(1)通過獲取本地相冊的圖片,經過裁剪後作為頭像。
(2)通過啟動手機相機,現拍圖片然後裁剪作為頭像。
(3)在APP中添加一些自帶的頭像資源,供用戶選擇(不夠人性化,目前很少使用)。
這次我們簡單介紹下通過獲取本地相冊以及相機拍攝的方法設置頭像,實現思路如下:
(1)通過startActivityForResult方法,分別傳遞調用系統相冊的Intent和調用相機拍照的Intent來做選擇
(2)調用Android系統中自帶的圖片剪裁,實現圖片的剪裁並在onActivityResult方法中獲取數據。
本次演示效果如下(分別為從本地相冊獲取以及從相機拍攝獲取頭像):
簡單布局文件這裡不再做贅述,本次試驗使用隱式intent調用相機以及本地相冊,未在配置清單上添加權限,依然可以調用。
java實現代碼如下:
import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button buttonLocal, buttonCamera; private ImageView imageView; //相機拍攝的頭像文件(本次演示存放在SD卡根目錄下) private static final File USER_ICON = new File(Environment.getExternalStorageDirectory(), "user_icon.jpg"); //請求識別碼(分別為本地相冊、相機、圖片裁剪) private static final int CODE_PHOTO_REQUEST = 1; private static final int CODE_CAMERA_REQUEST = 2; private static final int CODE_PHOTO_CLIP = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonLocal = (Button) findViewById(R.id.buttonLocal); buttonCamera = (Button) findViewById(R.id.buttonCamera); imageView = (ImageView) findViewById(R.id.imageView); buttonLocal.setOnClickListener(this); buttonCamera.setOnClickListener(this); } //設置點擊事件 @Override public void onClick(View view) { switch (view.getId()) { case R.id.buttonLocal: //調用獲取本地圖片的方法 getPicFromLocal(); break; case R.id.buttonCamera: //調用相機拍照的方法 getPicFromCamera(); break; default: break; } } /** * 從本機相冊獲取圖片 */ private void getPicFromLocal() { Intent intent = new Intent(); // 獲取本地相冊方法一 intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); //獲取本地相冊方法二 // intent.setAction(Intent.ACTION_PICK); // intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // "image/*"); startActivityForResult(intent, CODE_PHOTO_REQUEST); } /** * 通過相機拍攝獲取圖片, * 並存入設置的路徑中 */ private void getPicFromCamera() { Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); // 下面這句指定調用相機拍照後的照片存儲的路徑 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(USER_ICON)); startActivityForResult(intent, CODE_CAMERA_REQUEST); } /** * 圖片裁剪 * * @param uri */ private void photoClip(Uri uri) { // 調用系統中自帶的圖片剪裁 Intent intent = new Intent(); intent.setAction("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 是裁剪圖片寬高 *這裡僅僅是頭像展示,不建議將值設置過高 * 否則超過binder機制的緩存大小的1M限制 * 報TransactionTooLargeException */ intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); startActivityForResult(intent, CODE_PHOTO_CLIP); } /** * 提取保存裁剪之後的圖片數據,並設置頭像部分的View */ private void setImageToHeadView(Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); imageView.setImageBitmap(photo); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 用戶沒有進行有效的設置操作,返回 if (resultCode == RESULT_CANCELED) { Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show(); return; } switch (requestCode) { case CODE_CAMERA_REQUEST: if (USER_ICON.exists()) { photoClip(Uri.fromFile(USER_ICON)); } break; case CODE_PHOTO_REQUEST: if (data != null) { photoClip(data.getData()); } break; case CODE_PHOTO_CLIP: if (data != null) { setImageToHeadView(data); } break; } super.onActivityResult(requestCode, resultCode, data); } }
這裡要注意的是在裁剪圖片時,長和寬不要設置太大,否則超過binder機制的緩存大小的限制(受手機配置影響).報TransactionTooLargeException,在代碼中已經做了詳細標注,請各位看官在實現的時候萬萬注意。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
概念:LruCache什麼是LruCache?LruCache實現原理是什麼?這兩個問題其實可以作為一個問題來回答,知道了什麼是 LruCache,就只然而然的知道 Lr
前言現在看來其實更像是一篇知識概括,多處可能未講清楚,於是打算重寫事件分發,用一篇文章大致講清楚。首先,形式上筆者最先思考的是使用源碼,此者能從原理上講解分發機制,比起侃
廢話就不多說了,開始今天的正題,帶你實現開發者頭條APP的啟動頁。一.老規矩,先上效果圖從效果圖中我們可以看出,整個滑動的界面就是一個ViewPager實現,然後監聽Vi
Async-httpclient是一個用於Android應用程序開發的http訪問開源框架,開源在GitHub上,由於今天在GitHub上沒有看到下載地址,我這裡提供一個