现在的位置: 首页 > 综合 > 正文

CicleImageViewj加入自定义ImageView,progressbar

2018年09月01日 ⁄ 综合 ⁄ 共 5958字 ⁄ 字号 评论关闭

先上图,代码比较多,请看文后的源码

CicleImageview的具体实现code:

public class CircleImageView extends ImageView {

     private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;

     private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
     private static final int COLORDRAWABLE_DIMENSION = 1;

     private static final int DEFAULT_BORDER_WIDTH = 0;
     private static final int DEFAULT_BORDER_COLOR = Color.BLACK;

     private final RectF mDrawableRect = new RectF();
     private final RectF mBorderRect = new RectF();

     private final Matrix mShaderMatrix = new Matrix();
     private final Paint mBitmapPaint = new Paint();
     private final Paint mBorderPaint = new Paint();

     private int mBorderColor = DEFAULT_BORDER_COLOR;
     private int mBorderWidth = DEFAULT_BORDER_WIDTH;

     private Bitmap mBitmap;
     private BitmapShader mBitmapShader;
     private int mBitmapWidth;
     private int mBitmapHeight;

     private float mDrawableRadius;
     private float mBorderRadius;

     private boolean mReady;
     private boolean mSetupPending;

     public CircleImageView(Context context) {
         super(context);
     }

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

     public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         super.setScaleType(SCALE_TYPE);

         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);

         mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
         mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);

         a.recycle();

         mReady = true;

         if (mSetupPending) {
             setup();
             mSetupPending = false;
         }
     }

     @Override
     public ScaleType getScaleType() {
         return SCALE_TYPE;
     }

     @Override
     public void setScaleType(ScaleType scaleType) {
         if (scaleType != SCALE_TYPE) {
             throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
         }
     }

    //画笔来实现画圆
    @Override
     protected void onDraw(Canvas canvas) {
         if (getDrawable() == null) {
             return;
         }

         canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
         if(mBorderWidth != 0){
           canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
         }
     }

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

     public int getBorderColor() {
         return mBorderColor;
     }

     public void setBorderColor(int borderColor) {
         if (borderColor == mBorderColor) {
             return;
         }

         mBorderColor = borderColor;
         mBorderPaint.setColor(mBorderColor);
         invalidate();
     }

     public int getBorderWidth() {
         return mBorderWidth;
     }

     public void setBorderWidth(int borderWidth) {
         if (borderWidth == mBorderWidth) {
             return;
         }

         mBorderWidth = borderWidth;
         setup();
     }

     @Override
     public void setImageBitmap(Bitmap bm) {
         super.setImageBitmap(bm);
         mBitmap = bm;
         setup();
     }

    //图片的显示
    @Override
     public void setImageDrawable(Drawable drawable) {
         super.setImageDrawable(drawable);
         mBitmap = getBitmapFromDrawable(drawable);
         setup();
     }

     @Override
     public void setImageResource(int resId) {
         super.setImageResource(resId);
         mBitmap = getBitmapFromDrawable(getDrawable());
         setup();
     }

     private Bitmap getBitmapFromDrawable(Drawable drawable) {
         if (drawable == null) {
             return null;
         }

         if (drawable instanceof BitmapDrawable) {
             return ((BitmapDrawable) drawable).getBitmap();
         }

         try {
             Bitmap bitmap;

             if (drawable instanceof ColorDrawable) {
                 bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
             } else {
                 bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
             }

             Canvas canvas = new Canvas(bitmap);
             drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
             drawable.draw(canvas);
             return bitmap;
         } catch (OutOfMemoryError e) {
             return null;
         }
     }

     private void setup() {
         if (!mReady) {
             mSetupPending = true;
             return;
         }

         if (mBitmap == null) {
             return;
         }

         mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

         mBitmapPaint.setAntiAlias(true);
         mBitmapPaint.setShader(mBitmapShader);

         mBorderPaint.setStyle(Paint.Style.STROKE);
         mBorderPaint.setAntiAlias(true);
         mBorderPaint.setColor(mBorderColor);
         mBorderPaint.setStrokeWidth(mBorderWidth);

         mBitmapHeight = mBitmap.getHeight();
         mBitmapWidth = mBitmap.getWidth();

         mBorderRect.set(0, 0, getWidth(), getHeight());
         mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);

         mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
         mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);

         updateShaderMatrix();
         invalidate();
     }

     private void updateShaderMatrix() {
         float scale;
         float dx = 0;
         float dy = 0;

         mShaderMatrix.set(null);

         if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
             scale = mDrawableRect.height() / (float) mBitmapHeight;
             dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
         } else {
             scale = mDrawableRect.width() / (float) mBitmapWidth;
             dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
         }

         mShaderMatrix.setScale(scale, scale);
         mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);

         mBitmapShader.setLocalMatrix(mShaderMatrix);
     }

 }

自定义progressbar

<style name="progressBarHorizontal_color" parent="android:Widget.ProgressBar.Horizontal">
                 <item name="android:indeterminateOnly">false</item>
                 <item name="android:progressDrawable">@drawable/progress_color_horizontal</item>
                 <item name="android:minHeight">5dip</item>
                 <item name="android:maxHeight">5dip</item>
</style>

 

布局

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
          //progressbar背景属性在这里设置
        <item android:id="@android:id/background">
                 <shape>
                         <corners android:radius="5dip" />
                         <gradient android:startColor="#86AFC3"
                                 android:centerColor="#F7F7F7" android:centerY="0.75"
                                 android:endColor="#86AFC3" android:angle="270" />
                 </shape>
         </item>
        //progressbar第二进度条背景属性在这里设置
        <item android:id="@android:id/secondaryProgress">
                 <clip>
                         <shape>
                                 <corners android:radius="5dip" />
                                 <gradient android:startColor="#86AFC3"
                                         android:centerColor="#80C07AB8" android:centerY="0.75"
                                         android:endColor="#86AFC3" android:angle="270" />
                         </shape>
                 </clip>
         </item>
        //progressbar的外围线颜色在这里设置
        <item android:id="@android:id/progress">
                 <clip>
                         <shape>
                                 <corners android:radius="5dip" />
                                 <gradient android:startColor="#86AFC3"
                                         android:centerColor="#72BCDF" android:centerY="0.75"
                                         android:endColor="#86AFC3" android:angle="270" />
                         </shape>
                 </clip>
         </item>

源码地址:

http://download.csdn.net/detail/by317966834/7698397

抱歉!评论已关闭.