Android实现带圆环的圆形头像
作者:番茄炒蛋不要蛋 发布时间:2021-09-30 09:04:47
标签:Android,圆形头像
在最近写的一个天气APP中用到了圆形头像这样的一个样式,中间是圆形的头像(被圆形切割的图片),周围是一个带颜色的圆环。如下图所示,今天就来说一所它的实现过程。
它的实现也不是特别困难,其实就是用到了BitmapShader这个用法,然后包装成一个paint,最后画出一个圆。
1>实现一个Paint画出以圆形背景的圆。
2>以同样的圆形画出一个稍微小一点的圆,作为它的有色圆环。(此圆和上一个圆颜色不同)。
3>用BitmapShader实现一个新的圆,和第二个圆的大小圆心一致。
(BitmapShader只能在onDraw中实现,在其他外部无法实现)
具体代码如下:
1、界面代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_circle_weather"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.app_switchbutton.CircleWeatherActivity">
<com.example.app_switchbutton.CircleWeather
android:layout_width="250dp"
android:layout_height="wrap_content"
android:id="@+id/circleWeather"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
2、逻辑java代码:
package com.example.app_switchbutton;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by 尽途 on 2017/5/12.
*/
public class CircleWeather extends View {
private int widthSize;
private int heightSize;
private Paint mpaint1,mpaint2,mpaint3;
private Bitmap mbitmap;
private BitmapShader mbitmapshader;
public CircleWeather(Context context){
super(context);
initView();
}
public CircleWeather(Context context, AttributeSet attributeSet){
super(context,attributeSet);
initView();
}
private void initView(){
mpaint1=new Paint();
mpaint2=new Paint();
mpaint3=new Paint();
mpaint2.setStyle(Paint.Style.FILL);
mpaint3.setStyle(Paint.Style.FILL);
mpaint2.setAntiAlias(true);
mpaint3.setAntiAlias(true);
mpaint2.setColor(getResources().getColor(R.color.colorPrimary));
mpaint3.setColor(getResources().getColor(R.color.colorGray));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
widthSize=MeasureSpec.getSize(widthMeasureSpec);
heightSize=widthSize;
setMeasuredDimension(widthSize,heightSize);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
protected void onDraw(Canvas canvas) {
mbitmap= BitmapFactory.decodeResource(getResources(),R.drawable.hehua);//bitmapshader只能在onDraw中实现在外部不可以
int BitmapWidthSize=mbitmap.getWidth();
int BitmapHeightSize=mbitmap.getHeight();
float scale=(float)widthSize/Math.min(BitmapHeightSize,BitmapWidthSize);//获取最为合适的尺寸
Matrix matrix=new Matrix();
matrix.setScale(scale,scale);
Bitmap bitmap=Bitmap.createBitmap(mbitmap,0,0,BitmapWidthSize,BitmapHeightSize,matrix,true);
mbitmapshader=new BitmapShader(bitmap, Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
mpaint1.setShader(mbitmapshader);
canvas.drawCircle((float)widthSize*0.5f,(float)heightSize*0.5f,(float)heightSize*0.5f,mpaint2);
canvas.drawCircle((float)widthSize*0.5f,(float)heightSize*0.5f,(float)heightSize*0.47f,mpaint3);
canvas.drawCircle((float)widthSize*0.5f,(float)heightSize*0.5f,(float)heightSize*0.47f,mpaint1);
super.onDraw(canvas);
}
}
来源:https://blog.csdn.net/ZQL2288/article/details/72675490


猜你喜欢
- 在eclipse中默认的maven,它加载的是国外的镜像,那样速度会比较慢,如果使用国内镜像,比如阿里的中央仓库;速度会快很多。那如何修改m
- /// <summary> /// 转义字符
- 前言相信大家在使用spring的项目中,前台传递参数到后台是经常遇到的事, 我们必须熟练掌握一些常用的参数传递方式和注解的使用,本文将给大家
- Java Config 下的Spring Test方式用了三种方式:1.纯手动取bean:package com.wang.test;imp
- xml里面配置标签:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc./
- 1、产生原因其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景。示
- public class TestSqlserverJtds { public static void main(String[]
- Java代码 mvn install:install-file -DgroupId=包名 -DartifactId=项目名 -Dversio
- Java中可以使用关键字synchronized进行线程同步控制,实现关键资源顺序访问,避免由于多线程并发执行导致的数据不一致性等问题。sy
- MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱
- 算数运算操作符重载在kotlin中我定义一个类data class Point(val x: Int, val y: Int)然后实例化两个
- 现在视频应用越来越火,Periscope火起来后,国内也出现了不少跟风者,界面几乎跟Periscope一模一样.Periscope确实不错,
- 本文实例讲述了Android控件之Gallery用法。分享给大家供大家参考。具体如下:Gallery组件主要用于横向显示图像列表,不过按常规
- 因为项目不同,有些公用库而且还是c++的,还有一些带资源的,简单的复制遇到库升级又是一轮配置,编译成aar则解决这些麻烦。但是默认andri
- 今天在面试时遇到一道算法的题:给定一个字符串,输出每次字符出现的次数;要求按照顺序输出;自己的思路开始是:1.把String转换char数组
- c#下压缩解压,主要是用第三方类库进行封装的。ICSharpCode.SharpZipLib.dll类库,链接地址为你官方下载链接。压缩主要
- 在上一篇文章:Flutter进阶—实现动画效果(二)的最后,我们实现了一个控件,其中包含各种布局和状态处理控件。以及使用自定义的动画感知绘图
- 一、获取apikey,appsecret与商户号注册公众号、商户号二、获取用户的OpenId1.设置【授权回调页面域名】官方解释:用户在网页
- 一、文件的编码package com.study.io;/*** 测试文件编码*/public class EncodeDemo {/***
- 在java中如果我们需要遍历集合并删除其中的某些元素时,例如对于List来说,我们有三种办法。1. 普通的for循环遍历并删除public