安卓开发之头像的修改与拍照

本文介绍了一种在Android应用中实现个性化头像设置的方法,包括使用相机拍摄和从相册选择图片的功能,并展示了如何处理不同来源的图片以及进行圆形裁剪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人信息页面

弹窗页面

 

图库选择之后

拍照之后

1.个人信息xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_back"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="9dp"
        android:src="@drawable/back" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:text="个人信息"
        android:textColor="#080808"
        android:textSize="24sp" />

    <RelativeLayout
        android:id="@+id/rl_head"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dp"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="26dp"
                android:text="头像"
                android:textColor="@color/black"
                android:textSize="16sp" />

            <TextView
                android:id="@+id/tv_tip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="26dp"
                android:text="未设置"
                android:textColor="@color/Qblue"
                android:textSize="14dp" />
        </LinearLayout>

        <ImageView
            android:id="@+id/iv_head"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="20dp"
            android:src="@drawable/me" />
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.1dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:background="@color/view_color" />


    <RelativeLayout
        android:id="@+id/rl_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="26dp"
                android:text="昵称"
                android:textColor="@color/black"
                android:textSize="16sp" />

            <TextView
                android:id="@+id/tv_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="26dp"
                android:text="未设置"
                android:textColor="@color/Qblue"
                android:textSize="14dp" />
        </LinearLayout>

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="20dp"
            android:src="@drawable/in" />
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.1dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:background="@color/view_color" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="26dp"
            android:text="我的等级"
            android:textColor="@color/black"
            android:textSize="16sp" />

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="20dp"
            android:src="@drawable/in" />
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.1dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="20dp"
        android:background="@color/view_color" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="26dp"
            android:text="我的积分"
            android:textColor="@color/black"
            android:textSize="16sp" />

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="20dp"
            android:src="@drawable/in" />
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.1dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="20dp"
        android:background="@color/view_color" />

</LinearLayout>
弹窗xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e0e0e0"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_camera"
        android:layout_width="match_parent"
        android:layout_height="42dp"
        android:background="@color/white"
        android:gravity="center"
        android:text="拍照"
        android:textColor="@color/black"
        android:textSize="16sp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="0.1dp"
        android:background="@color/view_color" />

    <TextView
        android:id="@+id/tv_chose"
        android:layout_width="match_parent"
        android:layout_height="42dp"
        android:background="@color/white"
        android:gravity="center"
        android:text="从手机相册选择"
        android:textColor="@color/black"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/tv_cancle"
        android:layout_width="match_parent"
        android:layout_height="42dp"
        android:layout_marginTop="8dp"
        android:background="@color/white"
        android:gravity="center"
        android:text="取消"
        android:textColor="@color/Qblue"
        android:textSize="16sp" />

</LinearLayout>
2.java代码

package com.fb.hckjfb.activity;

import android.app.Dialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.fb.hckjfb.R;
import com.fb.hckjfb.RoundTools;

import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 个人信息
 */
public class MeActivity extends BaseActivity implements View.OnClickListener {

    private ImageView iv_back, iv_head;
    private RelativeLayout rl_name, rl_head;
    private int SELECT_PICTURE = 0x00;
    private int SELECT_CAMER = 0x01;
    private Bitmap bitmap;
    private RoundTools roundTools;
    private Dialog bottomDialog;
    private TextView tv_tip, tv_name;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_me);
        initView();
        //获取从上个页面传来的昵称并显示本页
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
    }

    @Override
    protected int getLayoutID() {
        return R.layout.activity_me;
    }

    @Override
    protected void initListener() {

    }

    @Override
    protected void initView() {
        iv_back = findViewById(R.id.iv_back);
        rl_name = findViewById(R.id.rl_name);
        rl_head = findViewById(R.id.rl_head);
        iv_head = findViewById(R.id.iv_head);
        tv_tip = findViewById(R.id.tv_tip);
        tv_name = findViewById(R.id.tv_name);

        iv_back.setOnClickListener(this);
        rl_name.setOnClickListener(this);
        rl_head.setOnClickListener(this);
    }

    @Override
    protected void initData() {

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.iv_back:
                finish();
                break;
            case R.id.rl_name:
                String name = tv_name.getText().toString();
                intent = new Intent(this, SetNameActivity.class);
                startActivity(intent);
                break;
            case R.id.rl_head:
                //选择对话框
                bottomDialog = new Dialog(this, R.style.BottomDialog);
                View contentView = LayoutInflater.from(this).inflate(R.layout.dialog_content_normal, null);
                //获取Dialog的监听
                TextView tv_camera = (TextView) contentView.findViewById(R.id.tv_camera);
                TextView tv_chose = (TextView) contentView.findViewById(R.id.tv_chose);
                TextView tv_cancle = (TextView) contentView.findViewById(R.id.tv_cancle);
                tv_camera.setOnClickListener(this);
                tv_chose.setOnClickListener(this);
                tv_cancle.setOnClickListener(this);

                bottomDialog.setContentView(contentView);
                ViewGroup.LayoutParams layoutParams = contentView.getLayoutParams();
                layoutParams.width = getResources().getDisplayMetrics().widthPixels;
                contentView.setLayoutParams(layoutParams);
                bottomDialog.getWindow().setGravity(Gravity.BOTTOM);//弹窗位置
                bottomDialog.getWindow().setWindowAnimations(R.style.BottomDialog_Animation);//弹窗样式
                bottomDialog.show();//显示弹窗
                break;
            case R.id.tv_camera://自定义Doalog的点击事件
                //通过相机拍摄照片
                Intent intentCamer = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intentCamer, SELECT_CAMER);
                bottomDialog.dismiss();//取消弹窗
                //设置头像后提示字体不显示
                tv_tip.setText("");
                break;
            case R.id.tv_chose:
                //通过相册选择图片
                intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.addCategory(intent.CATEGORY_OPENABLE);
                intent.setType("image/*");
                startActivityForResult(intent.createChooser(intent, "选择图片"), SELECT_PICTURE);
                bottomDialog.dismiss();//取消弹窗
                //设置头像后提示字体不显示
                tv_tip.setText("");
                break;
            case R.id.tv_cancle:
                bottomDialog.dismiss(); //取消弹窗
                break;
            default:
                break;
        }
    }

    /**
     * 返回结果处理
     *
     * @param requestCode 请求代码
     * @param resultCode  结果代码
     * @param data        返回数据
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == SELECT_PICTURE) {
            Log.i(TAG, "相册");
            handle(resultCode, data);
            roundTools = new RoundTools();
            Bitmap roundAlbum = roundTools.toRoundBitmap(bitmap);
            iv_head.setImageBitmap(roundAlbum);
        } else if (requestCode == SELECT_CAMER) {
            Log.i(TAG, "相机");
            if (data.getData() == null) {
                bitmap = (Bitmap) data.getExtras().get("data");
                Log.i(TAG, "BitData    " + bitmap);
                roundTools = new RoundTools();
                Bitmap roundCamer = roundTools.toRoundBitmap(bitmap);
                iv_head.setImageBitmap(roundCamer);
            } else try {
                bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data.getData());
                if (bitmap != bitmap) {//主要是防止handle处理出错,就会将先前获取相册的照片show出来
                    iv_head.setImageBitmap(bitmap);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 数据处理 共同点提取
     *
     * @param resultCode
     * @param data
     */
    private void handle(int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {//结果代码是Ok的
            Uri uri = data.getData();
            if (uri != null && data.getData() != null) {
                Log.i(TAG, "uri 和 data.getData()不为空");
                ContentResolver contentResolver = this.getContentResolver();
                if (bitmap != null) {
                    bitmap.recycle();
                }
                try {
                    bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri));//出错
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            } else {
                Log.i(TAG, "uri为空或者data为空   " + "数据:" + data.getData() + "  uri: " + uri);
            }
        }
    }

}
3.style弹窗样式

<!--底部弹窗样式-->
    <style name="BottomDialog" parent="@style/Base.V7.Theme.AppCompat.Light.Dialog">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

    <style name="BottomDialog.Animation" parent="Animation.AppCompat.Dialog">
        <item name="android:windowEnterAnimation">@anim/translate_dialog_in</item>
        <item name="android:windowExitAnimation">@anim/translate_dialog_out</item>
    </style>

anim进出效果

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="0"
    android:fromYDelta="100%"
    android:toXDelta="0"
    android:toYDelta="0">
</translate>

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:toYDelta="100%">
</translate>

4.最后别忘记添加权限

 <!-- 相机权限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 读写SD卡权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />



评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

举儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值