效果如下:


看代码:

MainActivity类中:

package com.example.ceshidemo;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.util.Calendar;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;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.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity {private static final int PHOTO_REQUEST_CAREMA = 1;private static final int PHOTO_REQUEST_GALLERY = 2;private static final int PHOTO_REQUEST_CUT = 3;private static final String PHOTO_FILE_NAME = "temp_photo.jpg";private File tempFile;private CircleImageView headIcon;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {headIcon = (CircleImageView) findViewById(R.id.headIcon);headIcon.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubchangeHeadIcon();}});changeTheme();File file = new File(MainActivity.this.getFilesDir(), "_head_icon.jpg");if (file.exists()) {headIcon.setImageURI(Uri.fromFile(file));}}private void changeTheme() {Calendar c = Calendar.getInstance();System.out.println(c.get(Calendar.HOUR_OF_DAY));if (c.get(Calendar.HOUR_OF_DAY) < 18 && c.get(Calendar.HOUR_OF_DAY) >= 6) {headIcon.setImageResource(R.drawable.ic_hehe);} else {headIcon.setImageResource(R.drawable.ic_launcher);}}private void changeHeadIcon() {final CharSequence[] items = { "相册", "拍照" };AlertDialog dlg = new AlertDialog.Builder(MainActivity.this).setTitle("选择图片").setItems(items, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int item) {// 这里item是根据选择的方式,if (item == 0) {Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("image/*");startActivityForResult(intent,PHOTO_REQUEST_GALLERY);} else {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {tempFile = new File(Environment.getExternalStorageDirectory(),PHOTO_FILE_NAME);Uri uri = Uri.fromFile(tempFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent,PHOTO_REQUEST_CAREMA);} else {Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!",Toast.LENGTH_SHORT).show();}}}}).create();dlg.show();}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == PHOTO_REQUEST_GALLERY) {if (data != null) {Uri uri = data.getData();Log.e("图片路径??", data.getData() + "");crop(uri);}} else if (requestCode == PHOTO_REQUEST_CAREMA) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {crop(Uri.fromFile(tempFile));} else {Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!",Toast.LENGTH_SHORT).show();}} else if (requestCode == PHOTO_REQUEST_CUT) {if (data != null) {final Bitmap bitmap = data.getParcelableExtra("data");headIcon.setImageBitmap(bitmap);// 保存图片到internal storageFileOutputStream outputStream;try {ByteArrayOutputStream out = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);out.flush();// out.close();// final byte[] buffer = out.toByteArray();// outputStream.write(buffer);outputStream = MainActivity.this.openFileOutput("_head_icon.jpg",Context.MODE_PRIVATE);out.writeTo(outputStream);out.close();outputStream.close();} catch (Exception e) {e.printStackTrace();}}try {if (tempFile != null && tempFile.exists())tempFile.delete();} catch (Exception e) {e.printStackTrace();}}}private void crop(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 250);intent.putExtra("outputY", 250);intent.putExtra("outputFormat", "JPEG");intent.putExtra("noFaceDetection", true);intent.putExtra("return-data", true);startActivityForResult(intent, PHOTO_REQUEST_CUT);}}
在这里自定了一个圆形的View:CircleImageView

package com.example.ceshidemo;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.net.Uri;import android.util.AttributeSet;import android.widget.ImageView;public class CircleImageView extends ImageView{    private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;    private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;    private static final int COLORDRAWABLE_DIMENSION = 1;    private static final int DEFAULT_BORDER_WIDTH = 0;    private static final int DEFAULT_BORDER_COLOR = Color.BLACK;    private final RectF mDrawableRect = new RectF();    private final RectF mBorderRect = new RectF();    private final Matrix mShaderMatrix = new Matrix();    private final Paint mBitmapPaint = new Paint();    private final Paint mBorderPaint = new Paint();    private int mBorderColor = DEFAULT_BORDER_COLOR;    private int mBorderWidth = DEFAULT_BORDER_WIDTH;    private Bitmap mBitmap;    private BitmapShader mBitmapShader;    private int mBitmapWidth;    private int mBitmapHeight;    private float mDrawableRadius;    private float mBorderRadius;    private boolean mReady;    private boolean mSetupPending;    public CircleImageView(Context context) {        super(context);        init();    }    public CircleImageView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public CircleImageView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);        mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);        mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);        a.recycle();        init();    }    private void init() {        super.setScaleType(SCALE_TYPE);        mReady = true;        if (mSetupPending) {            setup();            mSetupPending = false;        }    }    @Override    public ScaleType getScaleType() {        return SCALE_TYPE;    }    @Override    public void setScaleType(ScaleType scaleType) {        if (scaleType != SCALE_TYPE) {            throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));        }    }    @Override    protected void onDraw(Canvas canvas) {        if (getDrawable() == null) {            return;        }        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);        if (mBorderWidth != 0) {            canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);        }    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        setup();    }    public int getBorderColor() {        return mBorderColor;    }    public void setBorderColor(int borderColor) {        if (borderColor == mBorderColor) {            return;        }        mBorderColor = borderColor;        mBorderPaint.setColor(mBorderColor);        invalidate();    }    public int getBorderWidth() {        return mBorderWidth;    }    public void setBorderWidth(int borderWidth) {        if (borderWidth == mBorderWidth) {            return;        }        mBorderWidth = borderWidth;        setup();    }    @Override    public void setImageBitmap(Bitmap bm) {        super.setImageBitmap(bm);        mBitmap = bm;        setup();    }    @Override    public void setImageDrawable(Drawable drawable) {        super.setImageDrawable(drawable);        mBitmap = getBitmapFromDrawable(drawable);        setup();    }    @Override    public void setImageResource(int resId) {        super.setImageResource(resId);        mBitmap = getBitmapFromDrawable(getDrawable());        setup();    }    @Override    public void setImageURI(Uri uri) {        super.setImageURI(uri);        mBitmap = getBitmapFromDrawable(getDrawable());        setup();    }    private Bitmap getBitmapFromDrawable(Drawable drawable) {        if (drawable == null) {            return null;        }        if (drawable instanceof BitmapDrawable) {            return ((BitmapDrawable) drawable).getBitmap();        }        try {            Bitmap bitmap;            if (drawable instanceof ColorDrawable) {                bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);            } else {                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);            }            Canvas canvas = new Canvas(bitmap);            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());            drawable.draw(canvas);            return bitmap;        } catch (OutOfMemoryError e) {            return null;        }    }    private void setup() {        if (!mReady) {            mSetupPending = true;            return;        }        if (mBitmap == null) {            return;        }        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);        mBitmapPaint.setAntiAlias(true);        mBitmapPaint.setShader(mBitmapShader);        mBorderPaint.setStyle(Paint.Style.STROKE);        mBorderPaint.setAntiAlias(true);        mBorderPaint.setColor(mBorderColor);        mBorderPaint.setStrokeWidth(mBorderWidth);        mBitmapHeight = mBitmap.getHeight();        mBitmapWidth = mBitmap.getWidth();        mBorderRect.set(0, 0, getWidth(), getHeight());        mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);        mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);        mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);        updateShaderMatrix();        invalidate();    }    private void updateShaderMatrix() {        float scale;        float dx = 0;        float dy = 0;        mShaderMatrix.set(null);        if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {            scale = mDrawableRect.height() / (float) mBitmapHeight;            dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;        } else {            scale = mDrawableRect.width() / (float) mBitmapWidth;            dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;        }        mShaderMatrix.setScale(scale, scale);        mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);        mBitmapShader.setLocalMatrix(mShaderMatrix);    }}
main_activity.xml文件:

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

自定义圆形的属性文件:

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

上面所有代码, 点击demo下载测试 :http://download.csdn.net/detail/onceing/8884045




更多相关文章

  1. Android(安卓)Studio 第五十期 - 自定义TabLayout
  2. Android实现图片缩放与旋转
  3. Android(安卓)Universal Image Loader 源码分析
  4. Android最好看的圆形进度条ProgressBar
  5. android 弹出选择框,简单通用弹出选择框
  6. ImageView的属性android:scaleType
  7. android 工程,点击图片,在屏幕显示
  8. 节操视频播放器
  9. android 图片设置圆角

随机推荐

  1. Android之GridLayout用法
  2. android学习——使用TableLayout动态生成
  3. Android(安卓)Glide图片加载库基础使用详
  4. Android(安卓)浏览器Browser二次开发(一)
  5. Android(安卓)Hack Retrofit 增强参数(固
  6. android应用创建子进程的方法探究
  7. Android消息机制详细解析
  8. Android(安卓)Intent的简介以及属性的详
  9. Android使用selector修改TextView中字体
  10. [置顶] Android(安卓)Binder跨进程与非跨