Navigation Drawer Activity设置头像

来源:互联网 发布:淘宝卖家钱款在哪看 编辑:程序博客网 时间:2024/06/06 11:46

一般更换头像,所需要实现的步骤有点击头像,选择拍照或相册,裁剪返回,细分如下:

  1. 弹框选择相册或拍照
    解决方法:使用开源框架ActionSheet
    https://github.com/baoyongzhang/android-ActionSheet
    或者自己写一个,参考代码:
    http://blog.csdn.net/Grandaunt/article/details/52448441
  2. 调用系统相机
  3. 打开系统相册

需注意路径不对,uri转bitmap,bitmap转uri,拍照时角度旋转等问题
打开系统相册的正确代码片段:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType(“image/*”);
startActivityForResult(intent, 3);
可在Activity的onActivityResult方法中以
Uri imageUri = data.getData();
获取选择的图片uri

本着简单快速高效的原则,我使用的是GalleryFinal开源框架解决拍照和相册问题,GalleryFinal现支持所有主流的ImageLoader。
RxGalleryFinal与GalleryFinal相似,是GalleryFinal的升级版,更为简洁,个人需要我选了GalleryFinal。
GalleryFinal
https://github.com/pengjianbo/GalleryFinal
RxGalleryFinal
https://github.com/FinalTeam/RxGalleryFinal
4. 对返回图片Uri进行裁剪工作
推荐框架:
Circletextimageview
https://github.com/CoolThink/CircleTextImageView
圆形控件,跟ImageView使用方法相同
我使用的是Xutils3中的方法解决:

ImageOptions options = new ImageOptions.Builder()
//设置圆形
.setCircular(true)
//某些手机拍照时图片自动旋转,设置图片是否自动旋转为正
.setAutoRotate(true).build();
//等比例缩放居中显示
.setImageScaleType(ImageView.ScaleType.FIT_XY)

XUtils3不会使用转这里
http://www.jikexueyuan.com/course/2815.html
该框架的使用连接里都有详细介绍,文章末尾处放出示例以供参考

代码实现步骤:
步骤一:new一个Navigation Drawer Activity
这里写图片描述

步骤二:获取Navigation Drawer Activity里ImageView控件
这里写图片描述
由于布局嵌套,所以必须先获取爷爷控件再获取父控件载获取子控件
步骤二:引框架

    compile 'cn.finalteam:galleryfinal:1.4.8.7'    compile 'org.xutils:xutils:3.3.36'    compile 'com.baoyz.actionsheet:library:1.1.4'

步骤三:初始化

创建MyApplication继承Application,初始化xUtils3和galleryfinal

public class MyApplication extends Application {    private static MyApplication instance;    private static FunctionConfig mFunctionConfig;    private static FunctionConfig.Builder mFunctionConfigBuilder;    @Override    public void onCreate() {        super.onCreate();        x.Ext.init(this);        instance = this;          initGalleryFinal();    }    private void initGalleryFinal() {        mFunctionConfigBuilder = new FunctionConfig.Builder();        //设置主题        //ThemeConfig.CYAN        ThemeConfig theme = new ThemeConfig.Builder()                .build();        //配置功能        mFunctionConfig = mFunctionConfigBuilder                .setEnableCamera(true)                .setEnableEdit(true)                .setEnableCrop(true)                .setEnableRotate(true)                .setCropSquare(true)                .setEnablePreview(true)                .build();        //配置imageloader        ImageLoader imageloader = new XUtilsImageLoader();        CoreConfig coreConfig = new CoreConfig.Builder(getInstance(), imageloader, theme)                // .setDebug(BuildConfig.DEBUG)                .setFunctionConfig(mFunctionConfig)                .build();        GalleryFinal.init(coreConfig);    }    public static MyApplication getInstance(){        return instance;    }    public static FunctionConfig getFunctionConfig() {        return mFunctionConfig;    }    public static FunctionConfig.Builder getFunctionConfigBuilder() {        return mFunctionConfigBuilder;    }}

在AndroidManifest.xml中添加权限,使用MyApplication

 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <application        android:allowBackup="true"        android:name=".base.MyApplication"

由于我继承的是Xutils3,所以这里的ImageLoader 是XUtilsImageLoader

public class XUtilsImageLoader implements cn.finalteam.galleryfinal.ImageLoader {    private Bitmap.Config mImageConfig;    public XUtilsImageLoader() {        this(Bitmap.Config.RGB_565);    }    public XUtilsImageLoader(Bitmap.Config config) {        this.mImageConfig = config;    }    @Override    public void displayImage(Activity activity, String path, GFImageView imageView, Drawable defaultDrawable, int width, int height) {        ImageOptions options = new ImageOptions.Builder()                .setLoadingDrawable(defaultDrawable)                .setFailureDrawable(defaultDrawable)                .setConfig(mImageConfig)                .setSize(width, height)                .setCrop(true)                .setUseMemCache(false)                .build();        x.image().bind(imageView, "file://" + path, options);    }    @Override    public void clearMemoryCache() {    }}

设置ActionSheet皮肤

<style name="ActionSheetStyleiOS7">    <item name="actionSheetBackground">@android:color/transparent</item>    <item name="cancelButtonBackground">@drawable/slt_as_ios7_cancel_bt</item>    <item name="otherButtonTopBackground">@drawable/slt_as_ios7_other_bt_top</item>    <item name="otherButtonMiddleBackground">@drawable/slt_as_ios7_other_bt_middle</item>    <item name="otherButtonBottomBackground">@drawable/slt_as_ios7_other_bt_bottom</item>    <item name="otherButtonSingleBackground">@drawable/slt_as_ios7_other_bt_single</item>    <item name="cancelButtonTextColor">#1E82FF</item>    <item name="otherButtonTextColor">#1E82FF</item>    <item name="actionSheetPadding">10dp</item>    <item name="otherButtonSpacing">0dp</item>    <item name="cancelButtonMarginTop">10dp</item>    <item name="actionSheetTextSize">12sp</item></style>

在apptheme中添加ActionSheetStyleiOS7

这里写图片描述

步骤四:功能实现主要代码
设置参数

public class MainActivity extends AppCompatActivity        implements NavigationView.OnNavigationItemSelectedListener {    private Uri imagesrc;    private ImageView headicon;    private FunctionConfig mFunctionConfig;    private FunctionConfig.Builder mFunctionConfigBuilder;    private final int REQUEST_CODE_CAMERA = 1000;    private final int REQUEST_CODE_GALLERY = 1001;    private final int REQUEST_CODE_CROP = 1002;    private final int REQUEST_CODE_EDIT = 1003;

设置监听:

 headicon.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                mFunctionConfigBuilder = new FunctionConfig.Builder();                //设置主题                //ThemeConfig.CYAN                ThemeConfig theme = new ThemeConfig.Builder()                            //标题栏背景颜色                        .setTitleBarBgColor(Color.rgb(0xEE, 0xEE, 0xEE))                        //标题栏文本字体颜色                        .setTitleBarTextColor(Color.rgb(0x66,0x66,0x66))                        //设置Floating按钮Nornal状态颜色                        .setFabNornalColor(Color.rgb(0xDD, 0xDD, 0xDD))                        //设置Floating按钮Pressed状态颜色                        .setFabPressedColor(Color.rgb(0xBB, 0xBB, 0xBB))                        //选择框未选颜色                        .setCheckSelectedColor(Color.rgb(0xEE, 0xEE, 0xEE))                        //设置裁剪控制点和裁剪框颜色                        .setCropControlColor(Color.rgb(0xEE, 0xEE, 0xEE))                        .build();                // mFunctionConfigBuilder.setSelected(mPhotoList);//添加过滤集合                //配置功能                mFunctionConfig = mFunctionConfigBuilder                        .setEnableEdit(true)                        .setEnableCamera(true)                        .setEnableEdit(true)                        .setEnableCrop(true)                        .setEnableRotate(true)                        .setCropSquare(true)                        .setEnablePreview(true)                        .setRotateReplaceSource(true)                        .build();                //配置imageloader                ImageLoader imageloader = new XUtilsImageLoader();                CoreConfig coreConfig = new CoreConfig.Builder(MainActivity.this, imageloader,theme)                        // .setDebug(BuildConfig.DEBUG)                        .setFunctionConfig(mFunctionConfig)                        // .setPauseOnScrollListener(pauseOnScrollListener)                        //.setNoAnimcation(mCbNoAnimation.isChecked())                        //设置图片路径//                        .setTakePhotoFolder(takePhotoFolder)                        .build();                GalleryFinal.init(coreConfig);                ActionSheet.createBuilder(MainActivity.this, getSupportFragmentManager())                        .setCancelButtonTitle("取消(Cancel)")                        .setOtherButtonTitles("打开相册(Open Gallery)", "拍照(Camera)")                        .setCancelableOnTouchOutside(true)                        .setListener(new ActionSheet.ActionSheetListener() {                            @Override                            public void onDismiss(ActionSheet actionSheet, boolean isCancel) {                            }                            @Override                            public void onOtherButtonClick(ActionSheet actionSheet, int index) {                                switch (index) {                                    case 0:                                        GalleryFinal.openGallerySingle(REQUEST_CODE_GALLERY, mFunctionConfig, mOnHanlderResultCallback);                                        break;                                    case 1:                                        GalleryFinal.openCamera(REQUEST_CODE_CAMERA, mFunctionConfig, mOnHanlderResultCallback);                                        break;                                    default:                                        break;                                }                            }                        })                        .show();            }        });

回调函数:

 private GalleryFinal.OnHanlderResultCallback mOnHanlderResultCallback = new GalleryFinal.OnHanlderResultCallback() {        @Override        public void onHanlderSuccess(int reqeustCode, List<PhotoInfo> resultList) {            ImageOptions options = new ImageOptions.Builder()                    //设置圆形                    .setCircular(true)                    //某些手机拍照时图片自动旋转,设置图片是否自动旋转为正                    .setAutoRotate(true).build();            if (resultList != null) {                //获取图片路径                String photoPath= resultList.get(0).getPhotoPath();                //获取NavigationView父布局                NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);                View headerView = navigationView.getHeaderView(0);                ImageView headicon = (ImageView)headerView.findViewById(R.id.headicon);                x.image().bind(headicon,photoPath, options);  }        }        @Override        public void onHanlderFailure(int requestCode, String errorMsg) {            Toast.makeText(MainActivity.this, errorMsg, Toast.LENGTH_SHORT).show();        }    };

代码资源下载http://download.csdn.net/detail/grandaunt/9622979

0 0