Android 头像上传

首先,大家要了解头像上传需要怎么做。第一。我们要选择图片或者从照相机照一张。第二,需要对头像图片进行处理,第三就是要把头像显示到ImageButton上了。

1.布局文件

<RelativeLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity" >

        android:id="@+id/iv_head"

        android:layout_width="120dp"

        android:layout_height="120dp"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="10dp"

        android:background="@null"

        android:scaleType="fitXY"

        android:src="@drawable/ic_launcher_background" />

</RelativeLayout>

2.MainActivity

public class MainActivityextends AppCompatActivityimplements View.OnClickListener {

private ImageButtonivHead;

private Buttonbtn_picture,btn_photo,btn_cancle;

private Bitmaphead;// 头像Bitmap

    @SuppressLint("SdCardPath")

private static Stringpath ="/sdcard/myHead/";// sd路径

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ivHead = (ImageButton) findViewById(R.id.iv_head);

ivHead.setOnClickListener(this);

requestWindowFeature(Window.FEATURE_NO_TITLE);

Bitmap bt = BitmapFactory.decodeFile(path +"head.jpg");// 从Sd中找头像,转换成Bitmap

        if (bt !=null) {

@SuppressWarnings("deprecation")

Drawable drawable =new BitmapDrawable(toRoundBitmap(bt));// 转换成drawable

            ivHead.setImageDrawable(drawable);

}else {

/**

* 如果SD里面没有则需要从服务器取头像,取回来的头像再保存在SD中

*

*/

        }

}

public void onClick(View v) {

showDialog();

}

private void showDialog() {

View view = getLayoutInflater().inflate(R.layout.photo_choose_dialog,null);

final Dialog dialog =new Dialog(this, R.style.transparentFrameWindowStyle);

dialog.setContentView(view,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

Window window = dialog.getWindow();

// 设置显示动画

        window.setWindowAnimations(R.style.main_menu_animstyle);

WindowManager.LayoutParams wl = window.getAttributes();

wl.x =0;

wl.y = getWindowManager().getDefaultDisplay().getHeight();

// 以下这两句是为了保证按钮可以水平满屏

        wl.width = ViewGroup.LayoutParams.MATCH_PARENT;

wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;

// 设置显示位置

        dialog.onWindowAttributesChanged(wl);

// 设置点击外围解散

        dialog.setCanceledOnTouchOutside(true);

dialog.show();

btn_picture = (Button) window.findViewById(R.id.btn_picture);

btn_photo = (Button) window.findViewById(R.id.btn_photo);

btn_cancle = (Button) window.findViewById(R.id.btn_cancle);

btn_picture.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();

}

});

btn_photo.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();

}

});

btn_cancle.setOnClickListener(new View.OnClickListener() {

@Override

            public void onClick(View v) {

dialog.dismiss();

}

});

}

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卡中

                        ivHead.setImageBitmap(toRoundBitmap(head));// 用ImageView显示出来

                    }

}

break;

default:

break;

}

super.onActivityResult(requestCode, resultCode, data);

};

/**

* 调用系统的裁剪

*

    * @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",150);

intent.putExtra("outputY",150);

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 {

// 关闭流

                b.flush();

b.close();

}catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 把bitmap转成圆形

* */

    public Bitmap toRoundBitmap(Bitmap bitmap) {

int width = bitmap.getWidth();

int height = bitmap.getHeight();

int r =0;

// 取最短边做边长

        if (width < height) {

r = width;

}else {

r = height;

}

// 构建一个bitmap

        Bitmap backgroundBm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

// new一个Canvas,在backgroundBmp上画图

        Canvas canvas =new Canvas(backgroundBm);

Paint p =new Paint();

// 设置边缘光滑,去掉锯齿

        p.setAntiAlias(true);

RectF rect =new RectF(0,0, r, r);

// 通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,

// 且都等于r/2时,画出来的圆角矩形就是圆形

        canvas.drawRoundRect(rect, r /2, r /2, p);

// 设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉

        p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

// canvas将bitmap画在backgroundBmp上

        canvas.drawBitmap(bitmap,null, rect, p);

return backgroundBm;

}

}

3.photo_choose_dialog.xml


  <LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="#00000000"

    android:gravity="bottom"

    android:orientation="vertical"

    android:padding="5dip" >

        android:id="@+id/btn_picture"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:background="@drawable/photo_gallery_selector"

        android:paddingBottom="10dip"

        android:paddingTop="10dip"

        android:text="图库"

        android:textSize="16sp" />

        android:layout_width="match_parent"

        android:layout_height="0.5dip"

        android:background="#DAD9DB" />

        android:id="@+id/btn_photo"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:background="@drawable/photo_camera_selector"

        android:paddingBottom="10dip"

        android:paddingTop="10dip"

        android:text="拍照"

        android:textSize="16sp" />

        android:id="@+id/btn_cancle"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_marginTop="5dip"

        android:background="@drawable/photo_cancel_selector"

        android:paddingBottom="10dip"

        android:paddingTop="10dip"

        android:text="取消"

        android:textSize="16sp" />

</LinearLayout>

4.在res目录下创建anim文件夹,在anim下写photo_dialog_in_anim.xml,photo_dialog_out_anim.xml

photo_dialog_in_anim.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate

        android:duration="500"

        android:fromXDelta="0"

        android:fromYDelta="1000"

        android:toXDelta="0"

        android:toYDelta="0" />

</set>


photo_dialog_out_anim.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate

        android:duration="500"

        android:fromXDelta="0"

        android:fromYDelta="0"

        android:toXDelta="0"

        android:toYDelta="1000" />

</set>

5.在values的styles中加入

<style name="transparentFrameWindowStyle" parent="android:style/Theme.Dialog">

    <item name="android:windowBackground">@drawable/photo_choose_bg></item>

</style>

<style name="main_menu_animstyle">

<item name="android:windowEnterAnimation">@anim/photo_dialog_in_anim</item>

<item name="android:windowExitAnimation">@anim/photo_dialog_out_anim</item>

</style>


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,381评论 0 17
  • 本人初学Android,最近做了一个实现安卓简单音乐播放功能的播放器,收获不少,于是便记录下来自己的思路与知识总结...
    落日柳风阅读 19,103评论 2 41
  • 终于见到你,那个 暗恋了30年的姑娘 酒杯举起 看你 我已醉的不知 身在家乡 只想回到我们的 青葱时光 终于见到你...
    流星给的心愿阅读 122评论 0 0
  • (九) 第二天,武刚把两个孩子送到学校后,就带着母亲坐车往沭城县城。杨玉珍心里惶惶的,觉得自己像一只待宰的羔羊...
    甜蜜果阅读 355评论 0 1
  • 本周作业: 瑜伽可以提高我们的觉知度,要学会转变自己的行为模式。 给时间做合理规划,排排座,生命时间有限,智慧...
    如是无痕阅读 279评论 0 1