1. 程式人生 > >Android -- 顯示圓形頭像

Android -- 顯示圓形頭像

一. 前言

這章將從相簿和拍照獲取圖片,並顯示成圓形圖片。

二. 準備

首先需要做一個圓形的顯示區域,我用的是CircleImageView開源庫

CircleImageView原始碼地址:https://github.com/hdodenhof/CircleImageView

(1)下載CircleImageView原始碼

(2)將CircleImageView.class新增到你的專案中,一般存在工具類中

(3)新增後會出現一些錯誤資訊,這時我們需要將CircleImageView原始碼包中res/values/attrs.xml新增到我們的res/values下

注:attrs.xml中的引數與CircleImageView.class有關聯,所有要修改就一起改。

三. 實現

activity.xml佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
    <com.jmg.utils.CircleImageView
android:id="@+id/touxiang" android:layout_width="150dp" android:layout_height="150dp" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:src="@mipmap/logo_image" app:civ_border_width="2dp" app:civ_border_color="@color/colorBlack" /> </RelativeLayout>
注:這裡需要新增xmlns.app,不然會報錯。手敲app後選擇第二個自動匯入。

MainActivity.xml

import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.jmg.utils.CircleImageView;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {

    private CircleImageView imageView;
    private Bitmap head;// 頭像Bitmap
private static String path = "/sdcard/myHead/";// sd路徑
@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (CircleImageView) findViewById(R.id.touxiang);
imageView.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View view) {
                showTypeDialog();
}
        });
}

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    cropPhoto(data.getData());// 裁剪圖片
}

                break;
            case 2:
                if (resultCode == RESULT_OK) {
                    File temp = new File(Environment.getExternalStorageDirectory() + "/head.jpg");
cropPhoto(Uri.fromFile(temp));// 裁剪圖片
}

                break;
            case 3:
                if (data != null) {
                    Bundle extras = data.getExtras();
head = extras.getParcelable("data");
                    if (head != null) {
                        setPicToView(head);// 儲存在SD卡中
imageView.setImageBitmap(head);// ImageButton顯示出來
}
                }
                break;
            default:
                break;
}
        super.onActivityResult(requestCode, resultCode, data);
}

    private void showTypeDialog() {
        //顯示對話方塊
AlertDialog.Builder builder = new AlertDialog.Builder(this);
        final AlertDialog dialog = builder.create();
View view = View.inflate(this, R.layout.dialog_select, null);
TextView tv_select_gallery = (TextView) view.findViewById(R.id.tv_select_gallery);
TextView tv_select_camera = (TextView) view.findViewById(R.id.tv_select_camera);
tv_select_gallery.setOnClickListener(new View.OnClickListener() {// 在相簿中選取
@Override
public void onClick(View v) {
                Intent intent1 = new Intent(Intent.ACTION_PICK, null);
//開啟檔案
intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent1, 1);
dialog.dismiss();
}
        });
tv_select_camera.setOnClickListener(new View.OnClickListener() {// 呼叫照相機
@Override
public void onClick(View v) {
                Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent2.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "head.jpg")));
startActivityForResult(intent2, 2);// 採用ForResult開啟
dialog.dismiss();
}
        });
dialog.setView(view);
dialog.show();
}

    /**
     * 呼叫系統的裁剪功能
*
     * @param uri
*/
public void cropPhoto(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 是寬高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪圖片寬高
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}

    private void setPicToView(Bitmap mBitmap) {
        String sdStatus = Environment.getExternalStorageState();
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 檢測sd是否可用
return;
}
        FileOutputStream b = null;
File file = new File(path);
file.mkdirs();// 建立資料夾
String fileName = path + "head.jpg";// 圖片名字
try {
            b = new FileOutputStream(fileName);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把資料寫入檔案
} catch (FileNotFoundException e) {
            e.printStackTrace();
} finally {
            try {
                // 關閉流
if (b != null) {
                    b.flush();
b.close();
}
            } catch (IOException e) {
                e.printStackTrace();
}
        }
    }
}
注:新增以上如果在android 7.0系統執行會出現奔潰

新增MyApplication.class

import android.app.Application;
import android.os.StrictMode;
public class MyApplication extends Application {

    @Override
public void onCreate() {
        super.onCreate();
// android 7.0系統解決拍照的問題
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
}
}

然後再AndroidManifest.xml中新增

<application
android:name=".MyApplication"    //新增這一行

後續還會新增各手機獲取相簿圖片或拍照會出現的問題及解決辦法。

The End!

每天進步一點點!

相關推薦

Android -- 顯示圓形頭像

一. 前言這章將從相簿和拍照獲取圖片,並顯示成圓形圖片。二. 準備首先需要做一個圓形的顯示區域,我用的是CircleImageView開源庫CircleImageView原始碼地址:https://github.com/hdodenhof/CircleImageView(1)

Android圓形頭像(實現相機拍攝+相簿選擇+圖片裁剪功能)

功能實現:點選圓形頭像之後可以實現相簿上傳或者開啟相機,然後把得到的圖片經過剪裁,把剪裁過的圖片設定為頭像的背景圖 步驟:第一步:自定義一個類,繼承ImageView,重寫draw方法,實現外觀為圓形 第二步:在xml檔案中引用該控制元件 第三步:實現圓形頭像的點選事件,點

android 載入圓形頭像

Glide.with(PersonalActivity.this).load(userInfo.getAlbum()).transform(new CircleTransform(PersonalActivity.this)).into(mHeadimg);//頭像 /

android通訊聯絡QuickContactBadge 圓形頭像顯示詳解

    QuickContactBadge  在使用該類:      注意需要android.permission.READ_CONTACTS許可權,並且聯絡人裡面有資料,並且聯絡人需要有手機號碼,不然出來是一個空的 三、公共方

Android】自己定義圓形ImageView(圓形頭像 可指定大小)

代碼實現 err float avi rim war tor pos dsm 近期在仿手Q的UI,這裏面常常要用到的就是圓形頭像,看到 在android中畫圓形圖片的幾種辦法 這篇文章,了解了制作這樣的頭像的原理.只是裏面提供的方法另一個不足的地方就是

Android把Glide載入的圖片變為圓形頭像

Android把Glide載入的圖片變為圓形頭像 原圖: 效果圖: 新增依賴: compile 'com.github.bumptech.glide:glide:3.7.0' 程式碼實現: Glide.with(getContext()).load("http://ww

android自定義圓形頭像

轉載請註明出處:https://blog.csdn.net/u011038298/article/details/84637788  import android.content.Context; import android.content.res.TypedArray; impo

輕量級顯示圓形圖片 CircleView-Android

CircleView-Android 詳細介紹 CircleView,可以將圖片圓形顯示的View,實現方式很簡單,做這個控制元件就是為了可以直接方便的顯示圓形圖片,在顯示的時候,提供了更多的選擇,比如下面講到的偏移顯示。 使用方法 在build.gradle檔案中加上

android圓形頭像、圖片

public static Bitmap toRoundImage(Bitmap bitmap) { float roundPx = 0; int rectStartX=0; int rectStartY=0; Bitmap output = Bitmap.crea

Android絕對佈局 登陸介面 圓形頭像

絕對佈局:通過直接給定控制元件起始座標 ( x , y ) 和 ( w , l ) ,來生成控制元件。 圓形頭像:CircleImageView的使用 注:在build.gradle中新增: imp

Android實現使用者圓形頭像+背景模糊

效果呈現: 新增依賴: //圖片載入框架 implementation 'com.github.bumptech.glide:glide:3.7.0' implementation 'jp.wasabeef:glide-transform

Android使用CircleImageView實現圓形頭像

     一般做社交類APP,包括其他很多隻要有個人頁面的基本都會有設定頭像的這個功能,而且大多數也是圓形的頭像,顯的也比較美觀,github上有很多別人的第三方工具類,今天沒事就自己研究了一下看了看原始碼,下面附上程式碼。   自定義ViewCircleImageView 

Android 頭像上傳 相機+相簿 繪製圓形頭像

老話常談,在開始之前來幾張圖,看看效果: 主介面: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://

Android開發卷——設定圓形頭像,Android擷取圓形圖片》

在有一些程式開發中,有時候會用到圓形,擷取一張圖片的一部分圓形,作為頭像或者其他. 本例項就是截圖圓形,設定頭像的.      首先講解一些程式碼 <ImageView android:id="@+id/screenshot_img" android:lay

android 解決在列表條目中重新整理或者載入 Glide 圓形頭像會閃爍,位置錯亂

剛開始以為是listview或者Recyclerview的快取複用問題,結果研究了半天才知道是Glide圓形頭像CircleImageView的問題。 直接貼程式碼,程式碼很簡單,直接在Recyclerview的onBinderViewHolder裡面或者Li

Android自定義控制元件之圓形頭像

重寫ImageView public class CircleImageView extends ImageView { private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP; p

android圓形頭像:相機裁剪+相簿選擇

這裡我們呼叫的都是系統提供的類,所以使用起來非常簡單; 每次點選圓形頭像都會彈出一個PopupWindow,可以點選“拍照”,“手機相簿”和"取消"; 1,當點選"拍照"時開啟系統拍照頁面,拍照完成 成功接收圖片以後 攜帶資料 開啟 圖片裁剪頁面,裁剪完成  成功接收圖片

android 手把手教你繪製圓形頭像

自從騰訊QQ中的圓形頭像,火了起來後,現在我們在一些應用中都能看到圓形頭像的身影,在個人主頁或者個人資料面板中使用圓形頭像,會使整個佈局變得更加優雅 現在我們來進行第一步,建立一個繼承ImageV

Android 圓形頭像的兩種實現方式

前言 這篇部落格只是為了做一個記錄而已,方便而後查詢,核心程式碼都是直接採用鴻洋部落格裡面的程式碼的。 圓形頭像在實際開發中實際很常見,一般來說,主要有兩種實現方式: 第一種: 使用 Paint 的 Xfermode 實戰 第二種方法: 使用 B

Android自定義View之圓形頭像

記錄貼 現在製作圓形頭像的第三方工具已經很多了,本帖只為記錄自定義view學習過程。 1.主體程式碼部分 public class CirclePhotoView extends View { private int max;//最大進度 private