• 70、二维码生成+圆形头像


    values/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 /**
      4  *  圆形图片自定义控件
      5  */
      7 import android.content.Context;
      8 import android.content.res.TypedArray;
      9 import android.graphics.Bitmap;
     10 import android.graphics.BitmapShader;
     11 import android.graphics.Canvas;
     12 import android.graphics.Color;
     13 import android.graphics.Matrix;
     14 import android.graphics.Paint;
     15 import android.graphics.RectF;
     16 import android.graphics.Shader;
     17 import android.graphics.drawable.BitmapDrawable;
     18 import android.graphics.drawable.ColorDrawable;
     19 import android.graphics.drawable.Drawable;
     20 import android.util.AttributeSet;
     21 import android.widget.ImageView;
     23 import com.trainee.app.R;
     24 
     25 public class CircleImageView extends ImageView {
     27     private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
     29     private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
     30     private static final int COLORDRAWABLE_DIMENSION = 1;
     32     private static final int DEFAULT_BORDER_WIDTH = 0;
     33     private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
     35     private final RectF mDrawableRect = new RectF();
     36     private final RectF mBorderRect = new RectF();
     38     private final Matrix mShaderMatrix = new Matrix();
     39     private final Paint mBitmapPaint = new Paint();
     40     private final Paint mBorderPaint = new Paint();
     41 
     42     private int mBorderColor = DEFAULT_BORDER_COLOR;
     43     private int mBorderWidth = DEFAULT_BORDER_WIDTH;
     44 
     45     private Bitmap mBitmap;
     46     private BitmapShader mBitmapShader;
     47     private int mBitmapWidth;
     48     private int mBitmapHeight;
     49 
     50     private float mDrawableRadius;
     51     private float mBorderRadius;
     52 
     53     private boolean mReady;
     54     private boolean mSetupPending;
     55 
     56     public CircleImageView(Context context) {
     57         super(context);
     58     }
     59 
     60     public CircleImageView(Context context, AttributeSet attrs) {
     61         this(context, attrs, 0);
     62     }
     63 
     64     public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
     65         super(context, attrs, defStyle);
     66         super.setScaleType(SCALE_TYPE);
     67 
     68         TypedArray a = context.obtainStyledAttributes(attrs,
     69                 R.styleable.CircleImageView, defStyle, 0);
     70 
     71         mBorderWidth = a.getDimensionPixelSize(
     72                 R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
     73         mBorderColor = a.getColor(R.styleable.CircleImageView_border_color,
     74                 DEFAULT_BORDER_COLOR);
     76         a.recycle();
     78         mReady = true;
     79 
     80         if (mSetupPending) {
     81             setup();
     82             mSetupPending = false;
     83         }
     84     }
     85 
     86     @Override
     87     public ScaleType getScaleType() {
     88         return SCALE_TYPE;
     89     }
     90 
     91     @Override
     92     public void setScaleType(ScaleType scaleType) {
     93         if (scaleType != SCALE_TYPE) {
     94             throw new IllegalArgumentException(String.format(
     95                     "ScaleType %s not supported.", scaleType));
     96         }
     97     }
     98 
     99     @Override
    100     protected void onDraw(Canvas canvas) {
    101         if (getDrawable() == null) {
    102             return;
    103         }
    104 
    105         canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius,
    106                 mBitmapPaint);
    107         canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius,
    108                 mBorderPaint);
    109     }
    110 
    111     @Override
    112     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    113         super.onSizeChanged(w, h, oldw, oldh);
    114         setup();
    115     }
    116 
    117     public int getBorderColor() {
    118         return mBorderColor;
    119     }
    120 
    121     public void setBorderColor(int borderColor) {
    122         if (borderColor == mBorderColor) {
    123             return;
    124         }
    126         mBorderColor = borderColor;
    127         mBorderPaint.setColor(mBorderColor);
    128         invalidate();
    129     }
    130 
    131     public int getBorderWidth() {
    132         return mBorderWidth;
    133     }
    134 
    135     public void setBorderWidth(int borderWidth) {
    136         if (borderWidth == mBorderWidth) {
    137             return;
    138         }
    140         mBorderWidth = borderWidth;
    141         setup();
    142     }
    143 
    144     @Override
    145     public void setImageBitmap(Bitmap bm) {
    146         super.setImageBitmap(bm);
    147         mBitmap = bm;
    148         setup();
    149     }
    150 
    151     @Override
    152     public void setImageDrawable(Drawable drawable) {
    153         super.setImageDrawable(drawable);
    154         mBitmap = getBitmapFromDrawable(drawable);
    155         setup();
    156     }
    157 
    158     @Override
    159     public void setImageResource(int resId) {
    160         super.setImageResource(resId);
    161         mBitmap = getBitmapFromDrawable(getDrawable());
    162         setup();
    163     }
    164 
    165     private Bitmap getBitmapFromDrawable(Drawable drawable) {
    166         if (drawable == null) {
    167             return null;
    168         }
    169 
    170         if (drawable instanceof BitmapDrawable) {
    171             return ((BitmapDrawable) drawable).getBitmap();
    172         }
    174         try {
    175             Bitmap bitmap;
    176 
    177             if (drawable instanceof ColorDrawable) {
    178                 bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION,
    179                         COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
    180             } else {
    181                 bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
    182                         drawable.getIntrinsicHeight(), BITMAP_CONFIG);
    183             }
    185             Canvas canvas = new Canvas(bitmap);
    186             drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    187             drawable.draw(canvas);
    188             return bitmap;
    189         } catch (OutOfMemoryError e) {
    190             return null;
    191         }
    192     }
    193 
    194     private void setup() {
    195         if (!mReady) {
    196             mSetupPending = true;
    197             return;
    198         }
    200         if (mBitmap == null) {
    201             return;
    202         }
    204         mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,
    205                 Shader.TileMode.CLAMP);
    206 
    207         mBitmapPaint.setAntiAlias(true);
    208         mBitmapPaint.setShader(mBitmapShader);
    209 
    210         mBorderPaint.setStyle(Paint.Style.STROKE);
    211         mBorderPaint.setAntiAlias(true);
    212         mBorderPaint.setColor(mBorderColor);
    213         mBorderPaint.setStrokeWidth(mBorderWidth);
    214 
    216         mBitmapHeight = mBitmap.getHeight();
    217         mBitmapWidth = mBitmap.getWidth();
    218 
    221         mBorderRect.set(0, 0, getWidth(), getHeight());
    222         mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2,
    223                 (mBorderRect.width() - mBorderWidth) / 2);
    224 
    225         mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()
    226                 - mBorderWidth, mBorderRect.height() - mBorderWidth);
    227         mDrawableRadius = Math.min(mDrawableRect.height() / 2,
    228                 mDrawableRect.width() / 2);
    229 
    230         updateShaderMatrix();
    231         invalidate();
    232     }
    233 
    234     private void updateShaderMatrix() {
    235         float scale;
    236         float dx = 0;
    237         float dy = 0;
    238 
    239         mShaderMatrix.set(null);
    240 
    241         if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width()
    242                 * mBitmapHeight) {
    243             scale = mDrawableRect.height() / (float) mBitmapHeight;
    244             dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
    245         } else {
    246             scale = mDrawableRect.width() / (float) mBitmapWidth;
    247             dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
    248         }
    249 
    250         mShaderMatrix.setScale(scale, scale);
    251         mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth,
    252                 (int) (dy + 0.5f) + mBorderWidth);
    253 
    254         mBitmapShader.setLocalMatrix(mShaderMatrix);
    255     }
    256 
    257 }
     1 <LinearLayout
     2         android:id="@+id/layout_head"
     3         android:layout_width="170dp"
     4         android:layout_height="170dp"
     5         android:layout_marginTop="70dp"
     6         android:background="@android:color/black"
     7         android:gravity="center"
     8         android:layout_gravity="center">
     9         <com.trainee.app.widget.CircleImageView
    10             android:id="@+id/img_head_circle"
    11             android:layout_width="25dp"
    12             android:layout_height="25dp"
    13             android:layout_gravity="center"
    14             android:src="@drawable/login_touxiang" />
    15 </LinearLayout>
    private LinearLayout layout_head;
    private CircleImageView img_head_circle;
    
    img_head_circle = (CircleImageView) view.findViewById(R.id.img_head_circle);
    layout_head = (LinearLayout) view.findViewById(R.id.layout_head);
    
    try {
         String contentString = UserInfo.vipcode;  // 得到二维码内容
         if (!contentString.equals("")) {
             //根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(600*600)
             Bitmap qrCodeBitmap = EncodingHandler.createQRImage2(contentString, 700, 700);
    
             //------------------添加logo部分------------------//
             /*Bitmap logoBmp = BitmapFactory.decodeResource(mActivity.getResources(),
                            R.drawable.ic_launcher);*/
    
             //二维码和logo合并
             Bitmap bitmap = Bitmap.createBitmap(qrCodeBitmap.getWidth(), qrCodeBitmap
                            .getHeight(), qrCodeBitmap.getConfig());
             Canvas canvas = new Canvas(bitmap);
             //二维码
             canvas.drawBitmap(qrCodeBitmap, 0, 0, null);
             //logo绘制在二维码中央
             /*canvas.drawBitmap(logoBmp, qrCodeBitmap.getWidth() / 2
                            - logoBmp.getWidth() / 2, qrCodeBitmap.getHeight()
                            / 2 - logoBmp.getHeight() / 2, null);*/
    
             //------------------添加logo部分------------------//
    
             //   qrImgImageView.setImageBitmap(bitmap);
             layout_head.setBackground(ImageTools.bitmapToDrawable(bitmap));
         } else {
             Toast.makeText(mActivity, "Text can not be empty", Toast.LENGTH_SHORT).show();
         }
             mActivity.mToolBitmap.display(img_head_circle, UserInfo.headportraits);
        } catch (Exception e) {
                e.printStackTrace();
        }
    
    }
  • 相关阅读:
    Eclipse调试常用技巧
    12个小技巧,让你高效使用Eclipse
    Java程序生成exe可执行文件详细教程(图文说明)
    手机打开PDF文档中文英文支持(乱码问题)解决攻略
    Java修饰符public,private,protected及默认的区别
    Eclipse 各种小图标的含义
    continue break return的区别
    Android开发快速入门(环境配置、Android Studio安装)
    Struts2中的Unable to load configuration错误的分析与解决方法
    认识与入门 Markdown,Markdown教程
  • 原文地址:https://www.cnblogs.com/androidsj/p/5051380.html
Copyright © 2020-2023  润新知