网易首页 > 网易号 > 正文 申请入驻

android自定义弹出view android view旋转

0
分享至

要做的效果传统的View方式

自定义一个控件,继承View。onDraw()中在canvas上画12个小圈。

首先定义控件使用的属性,在valuse目录下创建一个attrs.xml。

<resources> <declare-styleable name="HyLoadingView"> <attr name="hy_size" format="dimension" /> <attr name="hy_color" format="color" /> <attr name="hy_duration" format="integer" /> declare-styleable>resources>

编写自定义控件代码

class HyLoadingView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : View(context, attrs, defStyleAttr) { constructor(context: Context) : this(context, null, 0) constructor(context: Context, attrs: AttributeSet? = null) : this(context, attrs, 0) /** * 小圆总数 */ private val circleCount = 12 /** * 小圆圆心之间间隔角度差 */ private val degreePerCircle = 360 / circleCount /** * 记录所有小圆半径 */ private val mWholeCircleRadius = FloatArray(circleCount) /** * 记录所有小圆颜色 */ private val mWholeCircleColors = IntArray(circleCount) /** * 小圆最大半径 */ private var mMaxCircleRadius = 0f /** * 控件大小 */ private var mSize = 0 /** * 小圆颜色 */ private var mColor = 0 /** * 画笔 */ private lateinit var mPaint: Paint private var mAnimator: ValueAnimator? = null private var mAnimateValue = 1 /** * 动画时长 */ private var mDuration = 0L /** * 动画监听 */ private val mUpdateListener = AnimatorUpdateListener { animation -> mAnimateValue = animation.animatedValue as Int invalidate() } init { initAttrs(context, attrs) initPaint() initValue() } /** * 初始化自定义属性 */ private fun initAttrs(context: Context, attrs: AttributeSet?) { val ta = context.obtainStyledAttributes(attrs, R.styleable.HyLoadingView) mSize = ta.getDimensionPixelSize( R.styleable.HyLoadingView_hy_size, DimensionUtils.withDIP(100f).toPX().toInt() ) setSize(mSize) mColor = ta.getColor(R.styleable.HyLoadingView_hy_color, Color.parseColor("#333333")) setColor(mColor) mDuration = ta.getInt(R.styleable.HyLoadingView_hy_duration, 1500).toLong() ta.recycle() } /** * 初始化画笔 */ private fun initPaint() { mPaint = Paint().apply { isAntiAlias = true //抗锯齿 isDither = true //防抖动

使用

id="@+id/loadingView"android:layout_width="wrap_content"android:layout_height="wrap_content"app:hy_size="40dp"app:hy_color="#666666" />Jetpack Compose的自定义控件

定义与编写

@Composablefun HyLoadingView(size: Dp = 50.dp, color: Color = Color(0xff333333)) { var mDegrees by remember { mutableStateOf(0f) } Canvas( modifier = Modifier .rotate(mDegrees) .size(size) ) { val minCircleRadius = size.value / 8.5f var degrees = 0f for (i in 0..11) { degrees += 360 / 12f val radius: Float val alpha: Float when (i) { 7 -> { radius = minCircleRadius * 1.25f alpha = 0.7f } 8 -> { radius = minCircleRadius * 1.5f alpha = 0.8f } 9 -> { radius = minCircleRadius * 1.75f alpha = 0.9f } 10 -> { radius = minCircleRadius * 2.0f alpha = 1f } 11 -> { radius = minCircleRadius * 1.75f alpha = 0.9f } else -> { radius = minCircleRadius alpha = 0.5f } } rotate(degrees) { drawCircle( color = color, radius = radius, center = center.div(2f), alpha = alpha ) } } } val scope = rememberCoroutineScope() LaunchedEffect(scope) { scope.launch { flow { for (i in 0..Int.MAX_VALUE) { emit(i) delay(2) } }.flowOn(Dispatchers.Default).collect { mDegrees = it.toFloat() } } }}

使用之

HyLoadingView(100.dp, MaterialTheme.colors.primary)很随便的说两句

做这个东西的思路是:计算好第一个圆的大小、位置、颜色(透明度),画出来;然后旋转角度,再画一个……画完之后,加上个动画就行了。

对比一下代码,明显使用Jetpack Compose更简洁。Jetpack Compose很优秀。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
太监是否会出现净身不彻底的情况?晚清一名宫女道出其中一些门道

太监是否会出现净身不彻底的情况?晚清一名宫女道出其中一些门道

抽象派大师
2026-01-28 02:30:30
75年,毛泽东和周恩来同时患上重病,毛泽东问周恩来:江山靠谁守

75年,毛泽东和周恩来同时患上重病,毛泽东问周恩来:江山靠谁守

明月清风阁
2026-01-28 14:45:03
越南人吐槽:我们学的历史课,“中国”占据了80%,还要背诵唐诗

越南人吐槽:我们学的历史课,“中国”占据了80%,还要背诵唐诗

铭记历史呀
2026-01-28 02:21:58
“老头乐”替代品来了!适合60岁以上老年人,不罚不扣能上牌上路

“老头乐”替代品来了!适合60岁以上老年人,不罚不扣能上牌上路

娱乐圈的笔娱君
2026-01-28 00:17:34
开国上将许世友之孙:中国首位火箭军女博士,长相俊美,为人低调

开国上将许世友之孙:中国首位火箭军女博士,长相俊美,为人低调

文史达观
2026-01-15 14:50:48
《太平年》演技最好的演员排名:周雨彤垫底,朱亚文惜败排在第2

《太平年》演技最好的演员排名:周雨彤垫底,朱亚文惜败排在第2

银河史记
2026-01-28 15:15:25
张兰不听劝,又晒孙子孙女,小玥儿太像大S,外套7000元 个子很高

张兰不听劝,又晒孙子孙女,小玥儿太像大S,外套7000元 个子很高

有范又有料
2026-01-27 15:42:10
关系藏不住了?华晨宇殷秀梅手挽手下班引发热议,恶心的一幕出现

关系藏不住了?华晨宇殷秀梅手挽手下班引发热议,恶心的一幕出现

李健政观察
2026-01-28 11:02:09
库页岛有“三不”:不属于中国、不像俄罗斯、不承认过去

库页岛有“三不”:不属于中国、不像俄罗斯、不承认过去

壹知眠羊
2026-01-13 07:14:17
莫拉塔:如果尼科-帕斯再留一年,下赛季我就不拿薪水

莫拉塔:如果尼科-帕斯再留一年,下赛季我就不拿薪水

懂球帝
2026-01-28 07:22:10
上海“杀妻藏尸”嫌犯朱晓东:新婚未1年谋害妻子,还花光其遗产

上海“杀妻藏尸”嫌犯朱晓东:新婚未1年谋害妻子,还花光其遗产

妙知
2026-01-27 17:33:40
小舅子买房让我出30万,妻子大吵大闹,说不给钱就要离婚

小舅子买房让我出30万,妻子大吵大闹,说不给钱就要离婚

秀秀情感课堂
2026-01-28 14:45:03
原来马斯克没说错,全球抢的不是芯片,而是中国20万一台的变压器

原来马斯克没说错,全球抢的不是芯片,而是中国20万一台的变压器

云上乌托邦
2026-01-22 13:10:38
新加坡撤军决定:50年驻军撤离,台海大局已定

新加坡撤军决定:50年驻军撤离,台海大局已定

似水流年忘我
2026-01-28 01:03:05
明确规定来了!机关事业单位职工下班后打牌打麻将,算违纪吗?

明确规定来了!机关事业单位职工下班后打牌打麻将,算违纪吗?

阿纂看事
2026-01-24 09:56:48
浙江一男童在商场玩耍,被“财神爷”锁定!

浙江一男童在商场玩耍,被“财神爷”锁定!

大象新闻
2026-01-28 11:53:18
大范围雨雪将返场!未来三天最低气温0℃

大范围雨雪将返场!未来三天最低气温0℃

上游新闻
2026-01-28 09:43:03
一个要求,震动东京:中国要求日本尽快归还,清算终于开始了

一个要求,震动东京:中国要求日本尽快归还,清算终于开始了

阿伧说事
2026-01-28 15:49:53
伊朗没想到特朗普敢这么绝,美军在准备一场“灭国之战”?

伊朗没想到特朗普敢这么绝,美军在准备一场“灭国之战”?

今夜繁星坠落
2026-01-26 21:09:09
中纪委明确饭局红线:公职人员,这5类饭局别碰

中纪委明确饭局红线:公职人员,这5类饭局别碰

娱乐督察中
2026-01-16 16:25:33
2026-01-28 16:27:02
大喵幻想世界
大喵幻想世界
世上美妙的事物都需要慢慢挖掘
50文章数 2关注度
往期回顾 全部

科技要闻

它是神也是毒!Clawdbot改名卷入千万诈骗

头条要闻

运动员退役后到山区支教:卖掉36块奖牌 与女友分手

头条要闻

运动员退役后到山区支教:卖掉36块奖牌 与女友分手

体育要闻

冒充职业球员,比赛规则还和对手现学?

娱乐要闻

王祖贤入驻某音:一条7秒视频吸粉55万

财经要闻

40倍杠杆断裂!水贝一黄金平台兑付困难

汽车要闻

中国豪华车老大之争:奥迪凭啥干掉奔驰宝马?

态度原创

亲子
艺术
时尚
健康
公开课

亲子要闻

液体钙哪个牌子好?十款权威认证儿童液体钙品牌,归一食口碑推荐

艺术要闻

震撼!19世纪油画巨匠的作品美得不可思议!

被章若楠、舒淇带火的毛衣,这样穿太时髦了!

耳石症分类型,症状大不同

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版