Android圓形圖片--自定義控制元件
Android圓形圖片控制元件效果圖如下:
程式碼如下:
RoundImageView.java
package com.dxd.roundimageview;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;
import com.alan.myimageview.R;
/**
* 圓形ImageView,可設定最多兩個寬度不同且顏色不同的圓形邊框。
* 設定顏色在xml佈局檔案中由自定義屬性配置引數指定
*/
public class RoundImageView extends ImageView {
private int mBorderThickness = 0;
private Context mContext;
private int defaultColor = 0xFFFFFFFF;
// 如果只有其中一個有值,則只畫一個圓形邊框
private int mBorderOutsideColor = 0;
private int mBorderInsideColor = 0;
// 控制元件預設長、寬
private int defaultWidth = 0;
private int defaultHeight = 0;
public RoundImageView(Context context) {
super(context);
mContext = context;
}
public RoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setCustomAttributes(attrs);
}
public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
setCustomAttributes(attrs);
}
private void setCustomAttributes(AttributeSet attrs) {
TypedArray a = mContext.obtainStyledAttributes(attrs,R.styleable.roundedimageview);
mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0);
mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color,defaultColor);
mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable() ;
if (drawable == null) {
return;
}
if (getWidth() == 0 || getHeight() == 0) {
return;
}
this.measure(0, 0);
if (drawable.getClass() == NinePatchDrawable.class)
return;
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
if (defaultWidth == 0) {
defaultWidth = getWidth();
}
if (defaultHeight == 0) {
defaultHeight = getHeight();
}
int radius = 0;
if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {// 定義畫兩個邊框,分別為外圓邊框和內圓邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 * mBorderThickness;
// 畫內圓
drawCircleBorder(canvas, radius + mBorderThickness / 2,mBorderInsideColor);
// 畫外圓
drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor);
} else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {// 定義畫一個邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;
drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);
} else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {// 定義畫一個邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;
drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderOutsideColor);
} else {// 沒有邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2;
}
Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);
canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight / 2 - radius, null);
}
/**
* 獲取裁剪後的圓形圖片
* @param radius半徑
*/
public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {
Bitmap scaledSrcBmp;
int diameter = radius * 2;
// 為了防止寬高不相等,造成圓形圖片變形,因此擷取長方形中處於中間位置最大的正方形圖片
int bmpWidth = bmp.getWidth();
int bmpHeight = bmp.getHeight();
int squareWidth = 0, squareHeight = 0;
int x = 0, y = 0;
Bitmap squareBitmap;
if (bmpHeight > bmpWidth) {// 高大於寬
squareWidth = squareHeight = bmpWidth;
x = 0;
y = (bmpHeight - bmpWidth) / 2;
// 擷取正方形圖片
squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
} else if (bmpHeight < bmpWidth) {// 寬大於高
squareWidth = squareHeight = bmpHeight;
x = (bmpWidth - bmpHeight) / 2;
y = 0;
squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,squareHeight);
} else {
squareBitmap = bmp;
}
if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) {
scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,diameter, true);
} else {
scaledSrcBmp = squareBitmap;
}
Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),
scaledSrcBmp.getHeight(),
Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint paint = new Paint();
Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(),scaledSrcBmp.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
canvas.drawCircle(scaledSrcBmp.getWidth() / 2,
scaledSrcBmp.getHeight() / 2,
scaledSrcBmp.getWidth() / 2,
paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
bmp = null;
squareBitmap = null;
scaledSrcBmp = null;
return output;
}
/**
* 邊緣畫圓
*/
private void drawCircleBorder(Canvas canvas, int radius, int color) {
Paint paint = new Paint();
/* 去鋸齒 */
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setColor(color);
/* 設定paint的 style 為STROKE:空心 */
paint.setStyle(Paint.Style.STROKE);
/* 設定paint的外框寬度 */
paint.setStrokeWidth(mBorderThickness);
canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);
}
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="roundedimageview">
<attr name="border_thickness" format="dimension" />
<attr name="border_inside_color" format="color" />
<attr name="border_outside_color" format="color"></attr>
</declare-styleable>
</resources>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:imagecontrol="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
>
<!-- 沒有指定圓形ImageView屬性時,預設沒有外邊圓顏色 -->
<!-- 需要將圖片資源自定為src ,或在程式中setImageResource(res) 不能設定background為圖片,這樣不能達到圓形效果-->
<com.dxd.roundimageview.RoundImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/img"
/>
<!-- border_outside_color 外部圓圈的顏色 -->
<!-- border_inside_color 內部部圓圈的顏色 -->
<!-- border_thickness 外圓和內圓的寬度 -->
<com.dxd.roundimageview.RoundImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/img"
imagecontrol:border_inside_color="#bc0978"
imagecontrol:border_outside_color="#ba3456"
imagecontrol:border_thickness="1dp"
/>
</LinearLayout>
3、主Activity中沒有相關程式碼,直接載入佈局檔案即可。相關文章
- Android自定義設定圓形圖片控制元件Android控制元件
- Android自定義View之圖片外形特效——輕鬆實現圓角和圓形圖片AndroidView特效
- 自定義圓形進度條控制元件控制元件
- Android 自定義圓形頭像Android
- Android自定義圓形頭像Android
- Android 自定義輪播圖片控制元件Android控制元件
- Android自定義圓形進度條Android
- 【Android】自定義樹形控制元件Android控制元件
- Android自定義控制元件系列之圓形進度條的實現Android控制元件
- 自定義drawable實現圓角圖片
- 自定義view實現圓角圖片View
- android圖片處理,讓圖片變成圓形Android
- 自定義ImageView完成圓形頭像自定義View
- 自定義圖片輪播控制元件控制元件
- Android Xfermode 實戰 實現圓形、圓角圖片Android
- 《Android開發卷——設定圓形頭像,Android擷取圓形圖片》Android
- 自定義圓形進度條
- Android自定義圓形進度條原始碼解析Android原始碼
- CSS圓形圖片效果CSS
- Glide實現圓角圖片,以及圓形圖片IDE
- (Android自定義控制元件)Android自定義狀態提示圖表Android控制元件
- Android自定義圓形進度條實現程式碼Android
- Android 自定義控制元件一 帶圓形進度的按鈕 ControlButton2Android控制元件
- android圓形頭像的選擇和剪下並儲存出圓形圖片Android
- 自定義頭像圓角控制元件控制元件
- Android進階 自定義View(三)圓形刻度進度條AndroidView
- 自定義圓形ImageView(仿QQ頭像)View
- Android自定義控制元件實現一個帶文字與數字的圓形進度條Android控制元件
- iOS專案開發實戰——自定義圓形進度提示控制元件iOS控制元件
- CGContextRef處理圓形圖片GCContext
- Android自定義控制元件——自定義屬性Android控制元件
- Android自定義控制元件之區域性圖片放大鏡--BiggerViewAndroid控制元件View
- Android自定義控制元件之區域性圖片放大鏡–BiggerViewAndroid控制元件View
- Android開發自定義控制元件實現一個圓形進度條【帶數值和動畫】Android控制元件動畫
- Android自定義控制元件之自定義組合控制元件Android控制元件
- Android中圖片圓形設定三種方法介紹Android
- Android自定義控制元件之自定義屬性Android控制元件
- 微信小程式裁剪圖片成圓形微信小程式