故事的开始
最近有个需求,支付成功的时候加个抽奖轮盘。类似问卷星提交后的那种东西,翻了一下gayhub,下面给出自己的实现思路.
写在题前
这东西是在github上一个项目是拓展的。但是实现时间和下载项目时间隔了有一阵。所以找不到原链没法挂上,还请见谅。若有知道原链的可以在评论区留一下,我后续加上。
效果图
照例先给最后的实现效果gif图(转gif图的时候应该是抽帧了。实际效果比图片好一点)
实现思路
1,绘制可以切换背景的奖品View
2,将其排列成九宫格
3,通过前后两个view的变换,营造出旋转的感觉
4,状态标识控制加/减速,直至停止,并发送回调
代码
- PrizeItemView(奖品View)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_white">
<View
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/shape_pink"
android:visibility="invisible" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_prize"
android:layout_width="60dp"
android:layout_height="45dp"
android:src="@drawable/png_prize" />
<TextView
android:id="@+id/tv_prize_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="9dp"
android:text="一个奖品"
android:textColor="#98520E"
android:textSize="22sp" />
</LinearLayout>
</FrameLayout>
/**
* Created by huahen on 2021/10/25
* ClassDescription : 抽奖转盘-奖品子view
*/
public class PrizeItemView extends FrameLayout implements PrizeItemApi {
private Context mContext;
private View mOverlay;
private ImageView ivPrize;
private TextView tvPrize;
public PrizeItemView(@NonNull Context context) {
this(context, null);
}
public PrizeItemView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public PrizeItemView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.item_prize, this);
mOverlay = findViewById(R.id.overlay);
ivPrize = findViewById(R.id.iv_prize);
tvPrize = findViewById(R.id.tv_prize_name);
mContext = context;
}
@Override
public void setFocus(boolean isFocused) {
if (mOverlay != null) {
mOverlay.setVisibility(isFocused ? INVISIBLE : VISIBLE);
}
}
@Override
public void setUi(PrizeListBean bean) {
ivPrize.setImageResource(bean.getPrize_path());
tvPrize.setText(bean.getGoodName());
}
}
/**
* Created by huahen on 2021/10/25
* ClassDescription :
*/
public interface PrizeItemApi {
void setFocus(boolean isFocused);//修改当前显示状态
void setUi(PrizeListBean bean