android图片处理 让图片变成圆形

这几天做项目,有些地方的图片需要用到圆形图片,所以百度了一下,在github上找到一个开源项目,处理很简单,效果如下:

使用起来特别简单,一共三步,具体如下:

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、接下来就是使用了,直接在布局文件中使用,具体使用如下:
直接创建一个自定义的CircleImageView   src属性设置你要改变成圆形的图片

<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.example.circleimageview.CircleImageView
 android:id="@+id/imageview"
 android:layout_width="100dp"
 android:layout_height="100dp"
 android:layout_centerInParent="true"
 android:src="@drawable/control_image"
 />
</RelativeLayout>

就是这么简单,希望对大家有用

demo的地址:图片处理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android编程之图片颜色处理方法

    本文实例讲述了Android编程之图片颜色处理方法.分享给大家供大家参考,具体如下: 你想做到跟美图秀秀一样可以处理自己的照片,美化自己的照片吗?其实你也可以自己做一个这样的软件,废话不多说了,直接上图,上代码了! 效果图如下: 没处理前: 处理之后: MainActivity.java的代码如下: package net.loonggg.test; import android.app.Activity; import android.graphics.Bitmap; import andro

  • Android 图片特效处理的方法实例

    1. 图片放缩 复制代码 代码如下: // zoom 放缩  public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {      int width = bitmap.getWidth();      int height = bitmap.getHeight();      Matrix matrix = new Matrix(); float scaleWidth = w / (float) width;      floa

  • Android 异步获取网络图片并处理导致内存溢出问题解决方法

    测试环境为Adnroid 2.1以上. 1.AndroidManifest.xml 权限配置: 添加互联网访问权限: 复制代码 代码如下: <uses-permission android:name="android.permission.INTERNET" /> 2.异步图片类 ImageDownloadTask 复制代码 代码如下: import java.io.ByteArrayOutputStream; import java.io.IOException; imp

  • Android图片处理:识别图像方向并显示实例教程

    在Android中使用ImageView显示图片的时候发现图片显示不正,方向偏了或者倒过来了. 解决这个问题很自然想到的分两步走: 1.自动识别图像方向,计算旋转角度: 2.对图像进行旋转并显示. 一.识别图像方向 首先在这里提一个概念EXIF(Exchangeable Image File Format,可交换图像文件),具体解释参见Wiki. 简而言之,Exif是一个标准,用于电子照相机(也包括手机.扫描器等)上,用来规范图片.声音.视屏以及它们的一些辅助标记格式. Exif支持的格式如下:

  • android图片处理之让图片变成圆形

    这几天做项目,有些地方的图片需要用到圆形图片,所以百度了一下,在github上找到一个开源项目,处理很简单,效果如下: 使用起来特别简单,一共三步,具体如下: 1.创建一个Java类CircleImageView把下面的代码复制过去,报错的导包 package de.hdodenhof.circleimageview; import edu.njupt.zhb.main.R; import android.content.Context; import android.content.res.T

  • Android模糊处理实现图片毛玻璃效果

    本文实例讲解了Android 虚化图片.模糊图片.图片毛玻璃效果的实现方法,具体内容如下 效果如图: 在Android可以用RenderScript方便的实现这个方法: private void blur(Bitmap bkg, View view, float radius) { Bitmap overlay = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8

  • android图片处理之让图片一直匀速旋转

    本文是在我的文章android图片处理,让图片变成圆形 的基础上继续写的,可以去看看,直接看也没关系,也能看懂 1.首先在res文件夹下创建一个名字为anim的文件夹,名字不要写错  2.在anim里面创建一个xlm文件:img_animation.xml,这个名字随便写都可以,注意不要大写,里面的代码如下: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http:/

  • android图片圆角、图片去色处理示例

    Android中图片处理 用来对Android中的项目图片进行处理 复制代码 代码如下: package com.zhanggeng.contact.tools; import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; import android

  • Android中3种图片压缩处理方法

    Android中图片的存在形式: 1:文件形式:二进制形式存在与硬盘中. 2:流的形式:二进制形式存在与内存中. 3:Bitmap的形式 三种形式的区别: 文件形式和流的形式:对图片体积大小并没有影响.也就是说,如果你手机SD卡上的图片通过流的形式读到内存中,在内存中的大小也是原图的大小. 注意:不是Bitmap的形式. Bitmap的形式:图片占用的内存会瞬间变大. 以下是代码的形式: /** * 图片压缩的方法总结 */ /* * 图片压缩的方法01:质量压缩方法 */ private Bi

  • Android图片处理实例介绍(图)

    1.图片处理 1.圆角图片 复制代码 代码如下: /**     * 转换成圆角     *      * @param bmp     * @param roundPx     * @return     */    public static Bitmap convertToRoundedCorner(Bitmap bmp, float roundPx) { Bitmap newBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight()

随机推荐