android仿微信雷达 头像效果 自定义view
ScreeningRadarView
public class ScreeningRadarView extends View {// 定义画笔Paint paint;float radiusDifference;/*** 起始角度*/private double bigCircleImageStartAngle = 45;private double centerCircleImageStartAngle = 90;private double smallCircleImageStartAngle = 30;/*** 图片直径*/private int imageDiameter;/*** 每个圆上图片数量*/private int imageCount = 3;/*** 图片集合*/private List<String> imageList;/*** 最外层 图片数量*/private int imageBigCircleCount = 4;/*** 间隔时间*/private static int INTERVAL_TIME = 10;/*** handle what*/private static int TURN_ANGLE = 13321;/***执行一圈时常*/// private static double MILLISECOND_DURATION = 6000;/*** 每次旋转角度*/private static double CALCULATION_TURN_ANGLE = 0.5;public ScreeningRadarView(Context context) {super(context);initParam();}public ScreeningRadarView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initParam();}public ScreeningRadarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initParam();}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public ScreeningRadarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);initParam();}private void initParam() {radiusDifference = getResources().getDimension(R.dimen.dp_50);imageDiameter = (int) getResources().getDimension(R.dimen.dp_40);//实例化画笔对象paint = new Paint();// 给画笔设置颜色paint.setColor(Color.parseColor("#f3f3f3"));// 设置画笔属性paint.setStyle(Paint.Style.STROKE);//画笔属性是空心圆paint.setStrokeWidth(4);//设置画笔粗细//设置虚线效果// 最后这句是设置虚线效果,里边的float数组的意思是:先画长度为3的实线// ,再间隔长度为2的空白,之后一直重复这个单元。这个数组的长度只要大于等于2就行,// 你可以设置多个数值,产生不同效果,最后这个0指的是与起始位置的偏移量。//paint.setPathEffect(new DashPathEffect(new float[]{20, 8}, 0));paint.setAntiAlias(true);}@Overrideprotected void onDraw(Canvas canvas) {if (bitmapList.size()!=10) {return;}/***最外层圆*/canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - radiusDifference, paint);for (int i = 0; i < 4; i++) {float pointX = (float) (getWidth() / 2 + (getWidth() / 2 - radiusDifference) * Math.cos(Math.toRadians(bigCircleImageStartAngle)));float pointY = (float) (getWidth() / 2 + (getWidth() / 2 - radiusDifference) * Math.sin(Math.toRadians(bigCircleImageStartAngle)));bigCircleImageStartAngle += 360 / imageBigCircleCount;canvas.drawBitmap(bitmapList.get(i), pointX - imageDiameter / 2,pointY - imageDiameter / 2, paint);}canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - 2 * radiusDifference, paint);for (int i = 4; i < 7; i++) {float pointX = (float) (getWidth() / 2 + (getWidth() / 2 - 2 * radiusDifference) * Math.cos(Math.toRadians(centerCircleImageStartAngle)));float pointY = (float) (getWidth() / 2 + (getWidth() / 2 - 2 * radiusDifference) * Math.sin(Math.toRadians(centerCircleImageStartAngle)));centerCircleImageStartAngle += 360 / imageCount;canvas.drawBitmap(bitmapList.get(i), pointX - imageDiameter / 2,pointY - imageDiameter / 2, paint);}canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - 3 * radiusDifference, paint);for (int i = 7; i < 10; i++) {float pointX = (float) (getWidth() / 2 + (getWidth() / 2 - 3 * radiusDifference) * Math.cos(Math.toRadians(smallCircleImageStartAngle)));float pointY = (float) (getWidth() / 2 + (getWidth() / 2 - 3 * radiusDifference) * Math.sin(Math.toRadians(smallCircleImageStartAngle)));smallCircleImageStartAngle += 360 / imageCount;canvas.drawBitmap(bitmapList.get(i), pointX - imageDiameter / 2,pointY - imageDiameter / 2, paint);}}/*** 生成圆形** @param bitmap* @return*/protected Bitmap makeRoundCorner(Bitmap bitmap) {int width = bitmap.getWidth();int height = bitmap.getHeight();int left = 0, top = 0, right = width, bottom = height;float roundPx = height / 2;if (width > height) {left = (width - height) / 2;top = 0;right = left + height;bottom = height;} else if (height > width) {left = 0;top = (height - width) / 2;right = width;bottom = top + width;roundPx = width / 2;}Bitmap output = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(output);int color = 0xff424242;Paint paint = new Paint();Rect rect = new Rect(left, top, right, bottom);RectF rectF = new RectF(rect);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);return changeBitmapSize(output);}/*** 缩小 指定** @param output* @return*/private Bitmap changeBitmapSize(Bitmap output) {int width = output.getWidth();int height = output.getHeight();
//计算压缩的比率float scaleWidth = ((float) imageDiameter) / width;float scaleHeight = ((float) imageDiameter) / height;//获取想要缩放的matrixMatrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);//获取新的bitmapoutput = Bitmap.createBitmap(output, 0, 0, width, height, matrix, true);output.getWidth();output.getHeight();return output;}public void startRotate(List<String> imageList) {this.imageList = imageList;bitmapList.clear();handleImageList();}private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == TURN_ANGLE) {if (bigCircleImageStartAngle > 360) {bigCircleImageStartAngle += CALCULATION_TURN_ANGLE;bigCircleImageStartAngle -= 360;} else {bigCircleImageStartAngle += CALCULATION_TURN_ANGLE;}if (centerCircleImageStartAngle > 360) {centerCircleImageStartAngle -= CALCULATION_TURN_ANGLE;centerCircleImageStartAngle -= 360;} else {centerCircleImageStartAngle -= CALCULATION_TURN_ANGLE;}if (smallCircleImageStartAngle > 360) {smallCircleImageStartAngle += CALCULATION_TURN_ANGLE;smallCircleImageStartAngle -= 360;} else {smallCircleImageStartAngle += CALCULATION_TURN_ANGLE;}invalidate();mHandler.removeMessages(TURN_ANGLE);mHandler.sendEmptyMessageDelayed(TURN_ANGLE, INTERVAL_TIME);}}};/*** 处理图片*/List<Bitmap> bitmapList=new ArrayList<>();private void handleImageList() {for (int i = 0; i < imageList.size(); i++) {returnBitMap(imageList.get(i));}}private void returnBitMap( String url){Glide.with(getContext()).load(url).into(new SimpleTarget<Drawable>() {@Overridepublic void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {BitmapDrawable bd = (BitmapDrawable) resource;bitmapList.add(makeRoundCorner(compressBitmap(bd.getBitmap())));if(bitmapList.size()==10){mHandler.sendEmptyMessageDelayed(TURN_ANGLE, INTERVAL_TIME);}}});}/*** 压缩图片** @param bitmap* 被压缩的图片* @param** @return* 压缩后的图片*/public Bitmap compressBitmap(Bitmap bitmap) {ByteArrayOutputStream baos = new ByteArrayOutputStream();int quality = 100;bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);// 循环判断压缩后图片是否超过限制大小while(baos.toByteArray().length / 1024 > 50*1024) {// 清空baosbaos.reset();bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);quality -= 10;}Bitmap newBitmap = BitmapFactory.decodeStream(new ByteArrayInputStream(baos.toByteArray()), null, null);return newBitmap;}
}
效果图 实际有旋转效果
调用方法
public void startRotate(List<String> imageList) {this.imageList = imageList;bitmapList.clear();handleImageList();}
android仿微信雷达 头像效果 自定义view相关推荐
- android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...
Android实现简单底部导航栏 Android仿微信滑动切换效果 发布时间:2020-10-09 19:48:00 来源:脚本之家 阅读:96 作者:丶白泽 Android仿微信滑动切换最终实现效果 ...
- Android仿IOS解锁密码界面-自定义view系列(6)
Android仿IOS解锁密码界面-自定义view系列 功能简介 主要实现步骤-具体内容看github项目里的代码 xml相关属性设置 Android Studio 代码 Android技术生活交流 ...
- php仿微信底部菜单,Android实现简单底部导航栏 Android仿微信滑动切换效果
Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...
- android滑动菜单图标,Android实现简单底部导航栏 Android仿微信滑动切换效果
Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...
- android 底部滑动效果怎么做,Android实现简单底部导航栏 Android仿微信滑动切换效果...
android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义view配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...
- android 表情键盘切换,Android仿微信键盘切换效果
Android 仿微信的键盘切换(录音,表情,文字,其他),IM通讯,类似朋友圈只要涉及到文字等相关的app都会要涉及到键盘的处理,今天就给大家分享一下Android 仿微信的键盘切换. 效果图如下: ...
- Android 仿芝麻信用进度条,自定义View仿支付宝芝麻信用分仪表盘效果
image 前言 灵感来自几天前看到一位作者的仿芝麻信用自定义View的文章很不错,所以我换了一种方式来进行实现,写了旧版和新版芝麻信用分仪表盘的效果. 截图 这是我做的效果,还是有点差距的,嘿嘿. ...
- Android仿微信朋友圈2自定义点赞评论弹框
最近在做类似微信朋友圈点赞评论的功能,有个点赞评论弹框交互,感觉效果很好,点击评论按钮弹框从按钮左边弹出,遇到了3个问题(弹出动画不对.弹框布局没有适配.弹出的位置显示不对),动画和布局好解决,弹出的 ...
- 仿微信录制视频之自定义View
最近公司一个项目需要实现仿微信拍照,然后我去看了看微信的界面: 然后我自己最后实现的界面是这样: 当然,这个界面不是重点,重点是这个自定义View需要实现单击实现拍照,长按实现录制视频.然后这个自定义 ...
最新文章
- Activit流程部署、删除
- 使用fis优化web站点
- javaweb如何定位
- python制作安装包(setup.py)
- 简单调试 Python 程序
- windows下eclipse搭建android_ndk开发环境
- 【云栖计算之旅】线下沙龙第2期精彩预告:Docker在云平台上的最佳实践
- 三相pmsm矢量控制仿真模型_实时控制系统的时序模型及其在AUTOSAR系统仿真监控中的应用-Foundations4.1控制理论...
- html5 在新标签页打开,Chrome,Javascript,window。在新标签页中打开
- Atitit.架构设计趋势 设计模式 ---微服务架构 soa
- android投影到创维电视,创维Miracast,手机怎么投屏到创维电视,
- DirectX修复工具增强版
- python脚本-fence栅栏密码
- 关于si4438以往犯的一些错误
- Python实现电子词典(图形界面)
- Chrome谷歌浏览器无需插件设置夜间模式,黑色主题
- 使用360安全卫士对计算机进行体检,360安全卫士使用教程 电脑体检
- GitHub部署静态网页
- 【第109期】那碗“我拒绝”的毒鸡汤,坑了多少游戏策划?
- VScode窗口保持
热门文章
- Expected indentation of 14 spaces but found 16
- 1.计算机组成原理—计算机系统概论
- 【哈佛积极心理学笔记】第10讲 如何改变
- nmcli 命令配置网络
- get和post特点
- linux模拟器 linux模拟器绿色版
- 中国计算机名称大全集,全国计算机等级
- AI人工智能毕业设计课题:水果识别,水果识别系统,蔬菜识别系统,果蔬识别系统
- python统计小写字母出现次数_Python函数计算字母字符数,跟踪“e”出现的次数...
- 第13课 形变之城--故事卡--听我说