Android开发:抽奖转盘的实现

故事的开始

最近有个需求,支付成功的时候加个抽奖轮盘。类似问卷星提交后的那种东西,翻了一下gayhub,下面给出自己的实现思路.

写在题前

这东西是在github上一个项目是拓展的。但是实现时间和下载项目时间隔了有一阵。所以找不到原链没法挂上,还请见谅。若有知道原链的可以在评论区留一下,我后续加上。

效果图

照例先给最后的实现效果gif图(转gif图的时候应该是抽帧了。实际效果比图片好一点)
轮盘

实现思路

1,绘制可以切换背景的奖品View
2,将其排列成九宫格
3,通过前后两个view的变换,营造出旋转的感觉
4,状态标识控制加/减速,直至停止,并发送回调

代码

  1. 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
  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值