自定义View圆角ImageView
来源:互联网 发布:linux ant build.xml 编辑:程序博客网 时间:2024/06/05 02:40
package com.example.a04_circular_bead_imageview.circularbead;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.ColorStateList;import android.content.res.Resources;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.ColorFilter;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PixelFormat;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.graphics.drawable.LayerDrawable;import android.net.Uri;import android.util.AttributeSet;import android.util.Log;import android.widget.ImageView;import com.example.a04_circular_bead_imageview.R;/** * Created by yujie on 2017/12/1. */@SuppressLint("AppCompatCustomView")public class SelectableRoundedImageView extends ImageView{ public static final String TAG = "SelectableRoundedImageView"; private int mResource = 0; private static final ScaleType[] sScaleTypeArray = { ScaleType.MATRIX, ScaleType.FIT_XY, ScaleType.FIT_START, ScaleType.FIT_CENTER, ScaleType.FIT_END, ScaleType.CENTER, ScaleType.CENTER_CROP, ScaleType.CENTER_INSIDE }; // Set default scale type to FIT_CENTER, which is default scale type of // original ImageView. private ScaleType mScaleType = ScaleType.FIT_CENTER; private float mLeftTopCornerRadius = 0.0f; private float mRightTopCornerRadius = 0.0f; private float mLeftBottomCornerRadius = 0.0f; private float mRightBottomCornerRadius = 0.0f; private float mBorderWidth = 0.0f; private static final int DEFAULT_BORDER_COLOR = Color.BLACK; private ColorStateList mBorderColor = ColorStateList.valueOf(DEFAULT_BORDER_COLOR); private boolean isOval = false; private Drawable mDrawable; private float[] mRadii = new float[] { 0, 0, 0, 0, 0, 0, 0, 0 }; public SelectableRoundedImageView(Context context) { super(context); } public SelectableRoundedImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SelectableRoundedImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SelectableRoundedImageView, defStyle, 0); final int index = a.getInt(R.styleable.SelectableRoundedImageView_android_scaleType, -1); if (index >= 0) { setScaleType(sScaleTypeArray[index]); } mLeftTopCornerRadius = a.getDimensionPixelSize( R.styleable.SelectableRoundedImageView_sriv_left_top_corner_radius, 0); mRightTopCornerRadius = a.getDimensionPixelSize( R.styleable.SelectableRoundedImageView_sriv_right_top_corner_radius, 0); mLeftBottomCornerRadius = a.getDimensionPixelSize( R.styleable.SelectableRoundedImageView_sriv_left_bottom_corner_radius, 0); mRightBottomCornerRadius = a.getDimensionPixelSize( R.styleable.SelectableRoundedImageView_sriv_right_bottom_corner_radius, 0); if (mLeftTopCornerRadius < 0.0f || mRightTopCornerRadius < 0.0f || mLeftBottomCornerRadius < 0.0f || mRightBottomCornerRadius < 0.0f) { throw new IllegalArgumentException("radius values cannot be negative."); } mRadii = new float[] { mLeftTopCornerRadius, mLeftTopCornerRadius, mRightTopCornerRadius, mRightTopCornerRadius, mRightBottomCornerRadius, mRightBottomCornerRadius, mLeftBottomCornerRadius, mLeftBottomCornerRadius }; mBorderWidth = a.getDimensionPixelSize( R.styleable.SelectableRoundedImageView_sriv_border_width, 0); if (mBorderWidth < 0) { throw new IllegalArgumentException("border width cannot be negative."); } mBorderColor = a .getColorStateList(R.styleable.SelectableRoundedImageView_sriv_border_color); if (mBorderColor == null) { mBorderColor = ColorStateList.valueOf(DEFAULT_BORDER_COLOR); } isOval = a.getBoolean(R.styleable.SelectableRoundedImageView_sriv_oval, false); a.recycle(); updateDrawable(); } @Override protected void drawableStateChanged() { super.drawableStateChanged(); invalidate(); } @Override public ScaleType getScaleType() { return mScaleType; } @Override public void setScaleType(ScaleType scaleType) { super.setScaleType(scaleType); mScaleType = scaleType; updateDrawable(); } @Override public void setImageDrawable(Drawable drawable) { mResource = 0; mDrawable = SelectableRoundedCornerDrawable.fromDrawable(drawable, getResources()); super.setImageDrawable(mDrawable); updateDrawable(); } @Override public void setImageBitmap(Bitmap bm) { mResource = 0; mDrawable = SelectableRoundedCornerDrawable.fromBitmap(bm, getResources()); super.setImageDrawable(mDrawable); updateDrawable(); } @Override public void setImageResource(int resId) { if (mResource != resId) { mResource = resId; mDrawable = resolveResource(); super.setImageDrawable(mDrawable); updateDrawable(); } } @Override public void setImageURI(Uri uri) { super.setImageURI(uri); setImageDrawable(getDrawable()); } private Drawable resolveResource() { Resources rsrc = getResources(); if (rsrc == null) { return null; } Drawable d = null; if (mResource != 0) { try { d = rsrc.getDrawable(mResource); } catch (Resources.NotFoundException e) { Log.w("NotFound", "Unable to find resource: " + mResource, e); // Don't try again. mResource = 0; } } return SelectableRoundedCornerDrawable.fromDrawable(d, getResources()); } private void updateDrawable() { if (mDrawable == null) { return; } ((SelectableRoundedCornerDrawable) mDrawable).setScaleType(mScaleType); ((SelectableRoundedCornerDrawable) mDrawable).setCornerRadii(mRadii); ((SelectableRoundedCornerDrawable) mDrawable).setBorderWidth(mBorderWidth); ((SelectableRoundedCornerDrawable) mDrawable).setBorderColor(mBorderColor); ((SelectableRoundedCornerDrawable) mDrawable).setOval(isOval); } public float getCornerRadius() { return mLeftTopCornerRadius; } /** * Set radii for each corner. * * @param leftTop The desired radius for left-top corner in dip. * @param rightTop The desired desired radius for right-top corner in dip. * @param leftBottom The desired radius for left-bottom corner in dip. * @param rightBottom The desired radius for right-bottom corner in dip. * */ public void setCornerRadiiDP(float leftTop, float rightTop, float leftBottom, float rightBottom) { final float density = getResources().getDisplayMetrics().density; final float lt = leftTop * density; final float rt = rightTop * density; final float lb = leftBottom * density; final float rb = rightBottom * density; mRadii = new float[] { lt, lt, rt, rt, rb, rb, lb, lb }; updateDrawable(); } public float getBorderWidth() { return mBorderWidth; } /** * Set border width. * * @param width * The desired width in dip. */ public void setBorderWidthDP(float width) { float scaledWidth = getResources().getDisplayMetrics().density * width; if (mBorderWidth == scaledWidth) { return; } mBorderWidth = scaledWidth; updateDrawable(); invalidate(); } public int getBorderColor() { return mBorderColor.getDefaultColor(); } public void setBorderColor(int color) { setBorderColor(ColorStateList.valueOf(color)); } public ColorStateList getBorderColors() { return mBorderColor;}
宁波好的整形医院www.zuanno.com
阅读全文
0 0
- 自定义View圆角ImageView
- 自定义View圆角ImageView
- 自定义View 之ImageView(二) 圆角ImageView
- 自定义view(imageview)
- Android 自定义View (ImageView )
- 自定义View--圆形ImageView
- 自定义view之圆形ImageView
- 自定义view (二<ImageView>)
- android自定义view之自定义imageview
- 自定义View 之 ImageView(一) 自定义圆形ImageView
- android自定义圆形头像view,继承imageview
- android自定义view-打造圆形ImageView(一)
- android自定义view-打造圆形ImageView(二)
- android自定义view-打造圆形ImageView(三)
- Android自定义View之圆形ImageView--RoundImageView
- Android自定义View之圆形ImageView
- Android自定义View(ImageView画圆)
- android自定义view-打造圆形ImageView(一)
- HDU4812 D tree 【点分治 + 乘法逆元】
- 商业模式是决定项目成败的关键
- Block 概要
- Android手机卡顿原因
- vue 通过下拉框组件了解Vue中父子组件通讯
- 自定义View圆角ImageView
- webstorm 2017 激活破解
- 详述 Java 中过滤器 Listener 的工作原理及使用方法
- 使用 ContentObserver 监听短信接收 onChange 方法调用两次
- Socket、Webservice和Json (二)
- 项目日志记录优化(一)
- 人工智能与伦理道德
- 字母排序
- 1049. 数列的片段和(20)