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相关推荐

  1. android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...

    Android实现简单底部导航栏 Android仿微信滑动切换效果 发布时间:2020-10-09 19:48:00 来源:脚本之家 阅读:96 作者:丶白泽 Android仿微信滑动切换最终实现效果 ...

  2. Android仿IOS解锁密码界面-自定义view系列(6)

    Android仿IOS解锁密码界面-自定义view系列 功能简介 主要实现步骤-具体内容看github项目里的代码 xml相关属性设置 Android Studio 代码 Android技术生活交流 ...

  3. php仿微信底部菜单,Android实现简单底部导航栏 Android仿微信滑动切换效果

    Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...

  4. android滑动菜单图标,Android实现简单底部导航栏 Android仿微信滑动切换效果

    Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...

  5. android 底部滑动效果怎么做,Android实现简单底部导航栏 Android仿微信滑动切换效果...

    android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义view配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...

  6. android 表情键盘切换,Android仿微信键盘切换效果

    Android 仿微信的键盘切换(录音,表情,文字,其他),IM通讯,类似朋友圈只要涉及到文字等相关的app都会要涉及到键盘的处理,今天就给大家分享一下Android 仿微信的键盘切换. 效果图如下: ...

  7. Android 仿芝麻信用进度条,自定义View仿支付宝芝麻信用分仪表盘效果

    image 前言 灵感来自几天前看到一位作者的仿芝麻信用自定义View的文章很不错,所以我换了一种方式来进行实现,写了旧版和新版芝麻信用分仪表盘的效果. 截图 这是我做的效果,还是有点差距的,嘿嘿. ...

  8. Android仿微信朋友圈2自定义点赞评论弹框

    最近在做类似微信朋友圈点赞评论的功能,有个点赞评论弹框交互,感觉效果很好,点击评论按钮弹框从按钮左边弹出,遇到了3个问题(弹出动画不对.弹框布局没有适配.弹出的位置显示不对),动画和布局好解决,弹出的 ...

  9. 仿微信录制视频之自定义View

    最近公司一个项目需要实现仿微信拍照,然后我去看了看微信的界面: 然后我自己最后实现的界面是这样: 当然,这个界面不是重点,重点是这个自定义View需要实现单击实现拍照,长按实现录制视频.然后这个自定义 ...

最新文章

  1. Activit流程部署、删除
  2. 使用fis优化web站点
  3. javaweb如何定位
  4. python制作安装包(setup.py)
  5. 简单调试 Python 程序
  6. windows下eclipse搭建android_ndk开发环境
  7. 【云栖计算之旅】线下沙龙第2期精彩预告:Docker在云平台上的最佳实践
  8. 三相pmsm矢量控制仿真模型_实时控制系统的时序模型及其在AUTOSAR系统仿真监控中的应用-Foundations4.1控制理论...
  9. html5 在新标签页打开,Chrome,Javascript,window。在新标签页中打开
  10. Atitit.架构设计趋势 设计模式 ---微服务架构  soa
  11. android投影到创维电视,创维Miracast,手机怎么投屏到创维电视,
  12. DirectX修复工具增强版
  13. python脚本-fence栅栏密码
  14. 关于si4438以往犯的一些错误
  15. Python实现电子词典(图形界面)
  16. Chrome谷歌浏览器无需插件设置夜间模式,黑色主题
  17. 使用360安全卫士对计算机进行体检,360安全卫士使用教程 电脑体检
  18. GitHub部署静态网页
  19. 【第109期】那碗“我拒绝”的毒鸡汤,坑了多少游戏策划?
  20. VScode窗口保持

热门文章

  1. Expected indentation of 14 spaces but found 16
  2. 1.计算机组成原理—计算机系统概论
  3. 【哈佛积极心理学笔记】第10讲 如何改变
  4. nmcli 命令配置网络
  5. get和post特点
  6. linux模拟器 linux模拟器绿色版
  7. 中国计算机名称大全集,全国计算机等级
  8. AI人工智能毕业设计课题:水果识别,水果识别系统,蔬菜识别系统,果蔬识别系统
  9. python统计小写字母出现次数_Python函数计算字母字符数,跟踪“e”出现的次数...
  10. 第13课 形变之城--故事卡--听我说