http://blog.csdn.net/xiaanming/article/details/18730223看了这篇博客,整理出自己需要的代码写了下面这个自定义头像这么一个demo.
效果图:
关键代码:
/*** * 头像控件 * @author LanYan * */ @SuppressLint({ "ClickableViewAccessibility", "DrawAllocation" }) public class PhotoImageView extends View implements OnClickListener{ private Paint mPaint; private Bitmap mBitmap; private int newValue; private int mWidth; private int mHeight; private boolean isClickable=true; public Bitmap getmBitmap() { return mBitmap; } public void setmBitmap(Bitmap mBitmap) { this.mBitmap = mBitmap; } @SuppressWarnings("deprecation") public PhotoImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO Auto-generated constructor stub int [] arr=ScreenUtil.initialScreen(context); mScreenHeight=arr[1]; mScreenWidth=arr[0]; Drawable mDrawable=getBackground(); if(mDrawable!=null){ setmBitmap(ImageUtils.drawableToBitmap(mDrawable)); setBackgroundDrawable(null); } mPaint=new Paint(); setOnClickListener(this); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); mHeight=mWidth=mScreenWidth<mScreenHeight?mScreenWidth/3:mScreenHeight/3; } public PhotoImageView(Context context, AttributeSet attrs) { this(context, attrs,0); // TODO Auto-generated constructor stub } public PhotoImageView(Context context) { this(context,null); // TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); initDraw(canvas); } private void initDraw(Canvas canvas) { // TODO Auto-generated method stub newValue=mScreenWidth<=mScreenHeight?mScreenWidth/3/3*2:mScreenHeight/3/3*2; if(getmBitmap()==null){ Bitmap mNewBitmap=Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888); setmBitmap(mNewBitmap); } mBitmap=ImageUtils.zipImage(getmBitmap(),newValue, newValue); mBitmap=ImageUtils.getRoundedCornerBitmap(mBitmap, mBitmap.getWidth()/2); mPaint.setAntiAlias(true); canvas.drawBitmap(getmBitmap(),mWidth/6,mHeight/6, mPaint); mPaint.setColor(Color.parseColor("#CDC7C1")); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(10); mPaint.setAntiAlias(true); canvas.drawCircle(mWidth/6+getmBitmap().getWidth()/2,mHeight/6+mBitmap.getHeight()/2, getmBitmap().getWidth()/2+5, mPaint); } @Override public void onClick(View v) { // TODO Auto-generated method stub if(isClickable){ if(listener!=null){ listener.onClick(); } } } public void setBitmap(Bitmap mBitmap){ newValue=mScreenWidth<=mScreenHeight?mScreenWidth/3/3*2:mScreenHeight/3/3*2; Bitmap mb=ImageUtils.zipImage(mBitmap,newValue, newValue); mPaint.reset(); mPaint.setAntiAlias(true); setmBitmap(mb); postInvalidate(); } public void setBackground(int id){ newValue=mScreenWidth<=mScreenHeight?mScreenWidth/3/3*2:mScreenHeight/3/3*2; Drawable mdDrawable=getResources().getDrawable(id); Bitmap bitmap=ImageUtils.drawableToBitmap(mdDrawable); Bitmap mb=ImageUtils.zipImage(bitmap,newValue, newValue); mPaint.reset(); mPaint.setAntiAlias(true); setmBitmap(mb); postInvalidate(); } public interface OnPhotoListener{ void onOpenCamera(); void onOpenPictures(); void onClick(); void onCancel(); } private OnPhotoListener listener; private int mScreenWidth; private int mScreenHeight; public OnPhotoListener getListener() { return listener; } public void setListener(OnPhotoListener listener) { this.listener = listener; } }
import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.widget.ImageView; /** * 图片处理工具类 * @author LanYan * */ public class ImageUtils { /*** * 获得圆角图片的方法 * @param bitmap * @param roundPx * @return */ public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){ Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } /** * 获得带倒影的图片方法 * @param bitmap * @return */ public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){ final int reflectionGap = 4; int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap,0, height/2, width, height/2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); canvas.drawRect(0, height,width,height + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } /** * Drawable 转Bitmap * @param drawable * @return */ public static Bitmap drawableToBitmap(Drawable drawable){ BitmapDrawable bd = (BitmapDrawable) drawable; return bd.getBitmap(); } /** * Bitmap 转Drawable * @param drawable * @return */ @SuppressWarnings("deprecation") public static Drawable bitmapToDrawable(Bitmap bitmap) { BitmapDrawable bd = new BitmapDrawable(bitmap); return bd; } /*** * 图片的缩放方法 * * @param bgimage * :源图片资源 * @param newWidth * :缩放后宽度 * @param newHeight * :缩放后高度 * @return */ public static Bitmap zipImage(Bitmap bgimage, double newWidth, double newHeight) { // 获取这个图片的宽和高 float width = bgimage.getWidth(); float height = bgimage.getHeight(); // 创建操作图片用的matrix对象 Matrix matrix = new Matrix(); // 计算宽高缩放率 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width, (int) height, matrix, true); return bitmap; } /** * @author sunglasses * @category 图片加载效果 * @param imageView * @param bitmap */ public static void fadeInDisplay(ImageView imageView, Bitmap bitmap) {//目前流行的渐变效果 final TransitionDrawable transitionDrawable = new TransitionDrawable( new Drawable[] { TRANSPARENT_DRAWABLE, new BitmapDrawable(imageView.getResources(), bitmap) }); imageView.setImageDrawable(transitionDrawable); transitionDrawable.startTransition(500); } private static final ColorDrawable TRANSPARENT_DRAWABLE = new ColorDrawable( android.R.color.transparent); }
源码下载地址:http://download.csdn.net/detail/anddroid_lanyan/8807533
原文地址:http://blog.csdn.net/anddroid_lanyan/article/details/46502405