zoukankan      html  css  js  c++  java
  • 让图片变成圆形

           只有三步

    1、创建一个Java类CircleImageView把下面的代码复制过去,报错的导包

    package de.hdodenhof.circleimageview;
    import edu.njupt.zhb.main.R;
    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.Matrix;
    import android.graphics.Paint;
    import android.graphics.RectF;
    import android.graphics.Shader;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.ColorDrawable;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.widget.ImageView;
    
    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);
        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);
      }
    
    }

    2、在values文件夹下面创建一个xlm文件attrs.xml把下面的代码复制进去

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <declare-styleable name="CircleImageView">
        <attr name="border_width" format="dimension" />
        <attr name="border_color" format="color" />
      </declare-styleable>
    </resources>
    

     3.直接在布局文件中使用  插入你想要的图片

    <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:background="#ff00ff"
    >

    <com.wang.CircleImageView
      android:id="@+id/imageview"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:layout_centerInParent="true"
      android:src="@drawable/a0a"
    />
    </RelativeLayout>

  • 相关阅读:
    CKeditor3.6.2 配置与精简
    CKEditor与CKFinder整合并实现文件上传功能
    实体关联关系映射:
    status pending状态
    wx:for
    小程序
    获取指定控件的值
    报表
    dataGridView 设置
    SQLite 的使用
  • 原文地址:https://www.cnblogs.com/www123----/p/7063674.html
Copyright © 2011-2022 走看看