CircularImageView 一 自定义圆形图片组件。
来源:互联网 发布:朽木充栋梁 网络剧 编辑:程序博客网 时间:2024/06/06 01:40
1、第一步,添加CircularImageView,如下图所示。
package com.example.administrator.myapplication;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.Paint;import android.graphics.PixelFormat;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.ImageView;import com.lidroid.xutils.bitmap.core.AsyncDrawable;public class CircularImageView extends ImageView { private int borderWidth; private int canvasSize; private Bitmap image; private Paint paint; private Paint paintBorder; public CircularImageView(final Context context) { this(context, null); } public CircularImageView(Context context, AttributeSet attrs) { this(context, attrs, R.attr.circularImageViewStyle); } public CircularImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // init paint paint = new Paint(); paint.setAntiAlias(true); paintBorder = new Paint(); paintBorder.setAntiAlias(true); // load the styled attributes and set their properties TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CircularImageView, defStyle, 0); if (attributes.getBoolean(R.styleable.CircularImageView_border, true)) {//int defaultBorderSize = (int) (4 * getContext().getResources().getDisplayMetrics().density + 0.5f); int defaultBorderSize = (int) (2 * getContext().getResources().getDisplayMetrics().density); setBorderWidth(0); setBorderColor(attributes.getColor(R.styleable.CircularImageView_border_color, Color.WHITE)); } if (attributes.getBoolean(R.styleable.CircularImageView_shadow, false)) addShadow(); } public void setBorderWidth(int borderWidth) { this.borderWidth = borderWidth; this.requestLayout(); this.invalidate(); } public void setBorderColor(int borderColor) { if (paintBorder != null) paintBorder.setColor(borderColor); this.invalidate(); } public void addShadow() { setLayerType(LAYER_TYPE_SOFTWARE, paintBorder); paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK); } @Override public void onDraw(Canvas canvas) { // load the bitmap if (this.getDrawable() instanceof AsyncDrawable) { // LogGloble.d("info", "draw AsyncDrawable "); Drawable drawable = this.getDrawable(); if (drawable.getIntrinsicWidth() > 0) { image = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas1 = new Canvas(image); // canvas.setBitmap(bitmap); // LogGloble.d("info", "drawable.getIntrinsicWidth()=== " + drawable.getIntrinsicWidth()); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas1); } } else { // LogGloble.d("info", "draw else "); image = drawableToBitmap(getDrawable()); // init shader if (image != null) { canvasSize = getMeasuredWidth();// if (canvas.getHeight() < canvasSize)// canvasSize = canvas.getHeight(); BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvasSize, canvasSize, false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); paint.setShader(shader); // LogGloble.d("info", "canvasSize = " + canvasSize + " canvas.getHeight() " + canvas.getHeight()); // circleCenter is the x or y of the view's center // radius is the radius in pixels of the cirle to be drawn // paint contains the shader that will texture the shape int circleCenter = (canvasSize - (borderWidth * 2)) / 2; canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) + borderWidth - 2.0f, paintBorder); canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) - 2.0f, paint); } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = measureWidth(widthMeasureSpec); int height = measureHeight(heightMeasureSpec); setMeasuredDimension(width, height); } private int measureWidth(int measureSpec) { int result = 0; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { // The parent has determined an exact size for the child. result = specSize; } else if (specMode == MeasureSpec.AT_MOST) { // The child can be as large as it wants up to the specified size. result = specSize; } else { // The parent has not imposed any constraint on the child. result = canvasSize; } return result; } private int measureHeight(int measureSpecHeight) { int result = 0; int specMode = MeasureSpec.getMode(measureSpecHeight); int specSize = MeasureSpec.getSize(measureSpecHeight); if (specMode == MeasureSpec.EXACTLY) { // We were told how big to be result = specSize; } else if (specMode == MeasureSpec.AT_MOST) { // The child can be as large as it wants up to the specified size. result = specSize; } else { // Measure the text (beware: ascent is a negative number) result = canvasSize; } return (result + 2); } public Bitmap drawableToBitmap(Drawable drawable) { if (drawable == null) { return null; } else if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; }}
2、第二步,往values里面添加attrs.xml,如下图所示。
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="CircularImageView"> <attr name="border" format="boolean"></attr> <attr name="border_width" format="dimension"></attr> <attr name="border_color" format="color"></attr> <attr name="shadow" format="boolean"></attr> </declare-styleable> <declare-styleable name="Theme"> <attr name="circularImageViewStyle" format="reference"></attr> </declare-styleable></resources>
3、第三步,如下图所示。
<?xml version="1.0" encoding="utf-8"?><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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.administrator.myapplication.MainActivity"> <com.example.administrator.myapplication.CircularImageView android:id="@+id/mciv" android:layout_width="wrap_content" android:layout_height="wrap_content" /></RelativeLayout>
4、第四步,添加图片login_logo.png,如下图所示。
‘
5、至此,运行,效果如下图所示。
0 0
- CircularImageView 一 自定义圆形图片组件。
- Android开源项目——自定义圆形图片组件CircularImageView
- Android自定义组件之圆形图片
- Android中自定义圆形图片(一)
- CircularImageView
- Android自定义圆形图片
- Android自定义圆形图片
- 自定义圆形图片
- 自定义显示圆形图片
- Android自定义圆形图片
- Android自定义圆形图片
- 自定义圆形图片
- Android 自定义圆形图片
- 自定义圆形图片CircleImageView
- 自定义圆形图片
- Android自定义圆形图片
- [Android]自定义圆形图片
- 自定义圆形图片
- 男人有啥都不能有大肚子——北漂18年(91)
- Java学习笔记 --- Java程序生命周期
- python语言之enumerate
- Linux命令导出、导入MySQL数据库的.sql文件
- loopback 搭建
- CircularImageView 一 自定义圆形图片组件。
- 笔记:Mysql导入数据库文件的方法
- redis-sentinel安装、配置与故障与故障转移演示
- 欢迎使用CSDN-markdown编辑器
- [BZOJ1059][ZJOI2007]矩阵游戏(二分图匹配)
- Android App的标题栏随ScrollView的滑动改变透明度
- HAProxy负载均衡
- 【模板】并查集
- URL和URI的区别