欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義View實(shí)現(xiàn)圓形切圖效果

 更新時(shí)間:2021年01月28日 15:28:40   作者:yangtianrui95  
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓形切圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

使用自定義View實(shí)現(xiàn)圓形ImageView的效果,具體內(nèi)容如下

目前圓形邊框還需要調(diào)整,這里有點(diǎn)問題

實(shí)現(xiàn)思路

使用一個(gè)Paint,將得到的Bitmap設(shè)置成paint的Shader,設(shè)置完成后,使用Matrix調(diào)整圖片至居中,使用RectF約束邊框,最后完成繪制

初始化Paint,設(shè)置Shader

private void init() {
 getBitmapFromDrawable();
 if (mBitmap == null) {
  return;
 }
 mShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

 // bitmap paint
 mFillPaint = new Paint();
 mFillPaint.setAntiAlias(true);
 mFillPaint.setStyle(Paint.Style.FILL);
 mFillPaint.setShader(mShader);

 // border paint
 mBoundPaint = new Paint();
 mBoundPaint.setAntiAlias(true);
 mBoundPaint.setStyle(Paint.Style.STROKE);
 mBoundPaint.setStrokeWidth(mBorderWidth);
 mBoundPaint.setColor(mBorderColor);

 // border rectF
 mBorderBound.set(calculateBitmapBound());

 // bitmap rectF
 mBitmapBound.set(calculateBitmapBound());
 mBitmapBound.inset(mBorderWidth - 10, mBorderWidth - 10);
 updateShaderMatrix();

 }

獲取Drawable

private Bitmap getBitmapFromDrawable() {
 Drawable drawable = getDrawable();
 if (drawable instanceof BitmapDrawable) {
  mBitmap = ((BitmapDrawable) drawable).getBitmap();
  mBitmapWidth = mBitmap.getWidth();
  mBitmapHeight = mBitmap.getHeight();
  return mBitmap;
 }
 return null;
 }

計(jì)算邊距

 /**
 * 計(jì)算Bitmap邊距
 */
 private RectF calculateBitmapBound() {
 int availableWidth = getWidth() - getPaddingLeft() - getPaddingRight();
 int availableHeight = getHeight() - getPaddingTop() - getPaddingBottom();
 int sideLength = Math.min(availableWidth, availableHeight); // 可用的直徑
 mRadius = sideLength / 2;

 int left = getPaddingLeft() + (availableWidth - sideLength) / 2;
 int top = getPaddingTop() + (availableHeight - sideLength) / 2;

 Log.d(TAG, "calculateBitmapBound: left >>> " + left + " top >>> " + top + " right >>> "
  + (left + sideLength) + " right >>> " + top + " bottom >>> " + (top + sideLength));
 return new RectF(left, top, left + sideLength, top + sideLength);
 }

調(diào)整Matrix,防止只顯示圖片邊角

 /**
 * 調(diào)整圖片縮放,目前只支持CenterCrop
 */
 private void updateShaderMatrix() {
 float scale;
 float dx = 0;
 float dy = 0;

 mShaderMatrix.set(null);

 // 調(diào)整縮放,使圖片居中
 if (mBitmapWidth * mBitmapBound.height() > mBitmapBound.width() * mBitmapHeight) {
  scale = mBitmapBound.height() / (float) mBitmapHeight;
  dx = (mBitmapBound.width() - mBitmapWidth * scale) * 0.5f;
 } else {
  scale = mBitmapBound.width() / (float) mBitmapWidth;
  dy = (mBitmapBound.height() - mBitmapHeight * scale) * 0.5f;
 }

 Log.d(TAG, "updateShaderMatrix: scale >>> " + scale);
 mShaderMatrix.setScale(scale, scale);
 // TODO: 16-10-15 http://chroya.iteye.com/blog/713869
 // 回到中心點(diǎn),便于下次縮放
 mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBitmapBound.left, (int) (dy + 0.5f) + mBitmapBound.top);

 mShader.setLocalMatrix(mShaderMatrix);
 }

onDraw

 @Override
 protected void onDraw(Canvas canvas) {
 if (mBitmap == null) {
  super.onDraw(canvas);
 }
 Log.d(TAG, "onDraw: centerX >>> " + mBitmapBound.centerX() + " centerY >>> " + mBitmapBound.centerY());
 canvas.drawCircle(mBitmapBound.centerX(), mBitmapBound.centerY(), mRadius, mFillPaint);
 // 繪制邊框
 canvas.drawCircle(mBorderBound.centerX(), mBorderBound.centerY(), mRadius, mBoundPaint);
 }

完整代碼

/**
 * Created by shixi_tianrui1 on 16-10-7.
 * 顯示圓形圖片的ImageView
 */

public class CircleImageView extends ImageView {

 private static final String TAG = "LOGGER";

 private BitmapShader mShader;
 private Paint mFillPaint; // 繪圖
 private Paint mBoundPaint; // 繪制圓邊

 private Bitmap mBitmap;
 private Drawable mDrawable;

 private int mBorderColor; // 邊框顏色
 private float mBorderWidth; // 邊框?qū)挾?

 private RectF mBorderBound = new RectF();
 private RectF mBitmapBound = new RectF();
 private Matrix mShaderMatrix = new Matrix();

 private int mRadius;
 private int mBitmapWidth;
 private int mBitmapHeight;

 private static final float DEFAULT_BORDER_WIDTH = 5;

 public CircleImageView(Context context) {
 this(context, null);
 }

 public CircleImageView(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }

 public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 TypedArray a = getResources().obtainAttributes(attrs, R.styleable.CircleImageView);
 mBorderColor = a.getColor(R.styleable.CircleImageView_borderColor, Color.BLUE);
 mBorderWidth = a.getDimension(R.styleable.CircleImageView_borderWidth, DEFAULT_BORDER_WIDTH);
 mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_borderWidth, 20);
 a.recycle();
 }

 private void init() {
 getBitmapFromDrawable();
 if (mBitmap == null) {
  return;
 }
 mShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

 // bitmap paint
 mFillPaint = new Paint();
 mFillPaint.setAntiAlias(true);
 mFillPaint.setStyle(Paint.Style.FILL);
 mFillPaint.setShader(mShader);

 // border paint
 mBoundPaint = new Paint();
 mBoundPaint.setAntiAlias(true);
 mBoundPaint.setStyle(Paint.Style.STROKE);
 mBoundPaint.setStrokeWidth(mBorderWidth);
 mBoundPaint.setColor(mBorderColor);

 // border rectF
 mBorderBound.set(calculateBitmapBound());

 // bitmap rectF
 mBitmapBound.set(calculateBitmapBound());
 mBitmapBound.inset(mBorderWidth - 10, mBorderWidth - 10);
 updateShaderMatrix();

 }

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 super.onSizeChanged(w, h, oldw, oldh);
 init();
 }

 /**
 * 計(jì)算Bitmap邊距
 */
 private RectF calculateBitmapBound() {
 int availableWidth = getWidth() - getPaddingLeft() - getPaddingRight();
 int availableHeight = getHeight() - getPaddingTop() - getPaddingBottom();
 int sideLength = Math.min(availableWidth, availableHeight); // 可用的直徑
 mRadius = sideLength / 2;

 int left = getPaddingLeft() + (availableWidth - sideLength) / 2;
 int top = getPaddingTop() + (availableHeight - sideLength) / 2;

 Log.d(TAG, "calculateBitmapBound: left >>> " + left + " top >>> " + top + " right >>> "
  + (left + sideLength) + " right >>> " + top + " bottom >>> " + (top + sideLength));
 return new RectF(left, top, left + sideLength, top + sideLength);
 }


 private Bitmap getBitmapFromDrawable() {
 Drawable drawable = getDrawable();
 if (drawable instanceof BitmapDrawable) {
  mBitmap = ((BitmapDrawable) drawable).getBitmap();
  mBitmapWidth = mBitmap.getWidth();
  mBitmapHeight = mBitmap.getHeight();
  return mBitmap;
 }
 return null;
 }

 @Override
 protected void onDraw(Canvas canvas) {
 if (mBitmap == null) {
  super.onDraw(canvas);
 }
 Log.d(TAG, "onDraw: centerX >>> " + mBitmapBound.centerX() + " centerY >>> " + mBitmapBound.centerY());
 canvas.drawCircle(mBitmapBound.centerX(), mBitmapBound.centerY(), mRadius, mFillPaint);
 // 繪制邊框
 canvas.drawCircle(mBorderBound.centerX(), mBorderBound.centerY(), mRadius, mBoundPaint);
 }


 /**
 * 調(diào)整圖片縮放,目前只支持CenterCrop
 */
 private void updateShaderMatrix() {
 float scale;
 float dx = 0;
 float dy = 0;

 mShaderMatrix.set(null);

 // 調(diào)整縮放,使圖片居中
 if (mBitmapWidth * mBitmapBound.height() > mBitmapBound.width() * mBitmapHeight) {
  scale = mBitmapBound.height() / (float) mBitmapHeight;
  dx = (mBitmapBound.width() - mBitmapWidth * scale) * 0.5f;
 } else {
  scale = mBitmapBound.width() / (float) mBitmapWidth;
  dy = (mBitmapBound.height() - mBitmapHeight * scale) * 0.5f;
 }

 Log.d(TAG, "updateShaderMatrix: scale >>> " + scale);
 mShaderMatrix.setScale(scale, scale);
 // TODO: 16-10-15 http://chroya.iteye.com/blog/713869
 // 回到中心點(diǎn),便于下次縮放
 mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBitmapBound.left, (int) (dy + 0.5f) + mBitmapBound.top);

 mShader.setLocalMatrix(mShaderMatrix);
 }
}

目前仍有點(diǎn)問題,解決后會(huì)及時(shí)更新。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

最新評(píng)論