Android抽獎功能

鋸齒流沙發表於2017-12-13

目前在很多的app都具備抽獎功能來吸引使用者,讓app具有趣味性和可玩性,以此來提供使用者對app的使用率,還可以通過此途徑來回報使用者,運營上也會得到一定的豐收。比如支付寶的抽紅包和抽黃金活動,都舉辦得很成功,吸引了一大批使用者,增加使用者粘性。

接下來帶大家實踐以下如何實現APP抽獎功能,先看下效果圖。

效果圖

View

沒中獎

中獎列表

程式碼

中獎彈框

public class PrizeWinningLayout extends RelativeLayout {

    private RelativeLayout.LayoutParams mParams;
    private static final int MP = RelativeLayout.LayoutParams.MATCH_PARENT;
    private View mWinningLayout;//獲獎彈框
    private TextView mShare;
//    private LinearLayout mBack;
    private ImageView mClose;
    private TextView mTitle;
    private TextView mContent;
    private RelativeLayout mDialogBg;
    private PrizeWinningListener mListener;

    public PrizeWinningLayout(Context context) {
        super(context);
        initView(context);
    }

    private void initView(final Context context) {
        this.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });
        mParams = new RelativeLayout.LayoutParams(MP,MP);
        //初始化獲獎彈框
        mWinningLayout = LayoutInflater.from(context).inflate(R.layout.prize_winning_layout,null);
        addView(mWinningLayout,mParams);

        mParams = new RelativeLayout.LayoutParams(PXUtils.getRealPixel(652),PXUtils.getRealPixel(874));
        mParams.topMargin = PXUtils.getRealPixel(40);
        mParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        mDialogBg = (RelativeLayout) mWinningLayout.findViewById(R.id.prize_winning_dialog_layout);
        mDialogBg.setLayoutParams(mParams);

        mShare = (TextView)mWinningLayout.findViewById(R.id.prize_winning_dialog_share);
        mClose = (ImageView) mWinningLayout.findViewById(R.id.winning_close);
//        mBack = (LinearLayout) mWinningLayout.findViewById(R.id.prize_winning_bar_layout);
        mTitle = (TextView)mWinningLayout.findViewById(R.id.prize_winning_dialog_grade);
        mContent = (TextView)mWinningLayout.findViewById(R.id.prize_winning_dialog_tip);

        mShare.setOnClickListener(mOnClickListener);
        mClose.setOnClickListener(mOnClickListener);
//        mBack.setOnClickListener(mOnClickListener);
    }

    public void setListener(PrizeWinningListener listener) {
        mListener = listener;
    }

    /**
     * 設定中獎內容
     * @param title
     * @param content
     */
    public void setContent(String title,String content){
        mTitle.setText(title);
        mContent.setText(content);
    }


    private OnClickListener mOnClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v == mShare){
                if (mListener != null){
                    mListener.share();
                }
            }else if (v == mClose){
                if (mListener != null){
                    mListener.closeDialog();
                }
            }
//            else if (v == mBack){
//                if (mListener != null){
//                    mListener.back();
//                }
//            }
        }
    };

    public interface PrizeWinningListener{
        void share();
        void closeDialog();
//        void back();
    }

}

複製程式碼

佈局prize_winning_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0C0B32">

    <RelativeLayout
        android:id="@+id/prize_winning_dialog_layout"
        android:layout_width="326dp"
        android:layout_height="437dp"
        android:layout_marginTop="20dp"
        android:layout_centerHorizontal="true"
        android:background="@mipmap/prize_winning_dialog">

        <TextView
            android:id="@+id/prize_winning_dialog_wel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="158dp"
            android:text="恭喜您!"
            android:paddingLeft="6dp"
            android:textColor="#ffffffff"
            android:textSize="20dp"
            android:textStyle="bold"/>

        <TextView
            android:id="@+id/prize_winning_dialog_grade"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/prize_winning_dialog_wel"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="6dp"
            android:text="獲得特等獎"
            android:textColor="#FFFDD649"
            android:textSize="30dp"
            android:textStyle="bold"
            />

        <TextView
            android:id="@+id/prize_winning_dialog_tip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/prize_winning_dialog_grade"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="2dp"
            android:gravity="center"
            android:text="價值10萬元的中脈獨家定製臻品鑽石\n(精工品質靚麗光彩)"
            android:textColor="#ffffffff"
            android:textSize="14dp"/>

        <TextView
            android:id="@+id/prize_winning_dialog_share"
            android:layout_width="115dp"
            android:layout_height="30dp"
            android:padding="2dp"
            android:layout_below="@+id/prize_winning_dialog_tip"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="120dp"
            android:background="@mipmap/prize_winning_btn_bg"
            android:gravity="center"
            android:text="檢視獲獎記錄"
            android:textColor="#F73532"
            android:textSize="14dp"/>

    </RelativeLayout>

    <ImageView
        android:id="@+id/winning_close"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_below="@+id/prize_winning_dialog_layout"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="27dp"
        android:src="@mipmap/prize_winning_close"/>


</RelativeLayout>

複製程式碼

這裡主要通過xml佈局彈框,然後通過介面回撥來設定點選。

注意:

彈框繼承RelativeLayout,需要設定setOnTouchListener方法返回true,也就是將觸控事件交給自己處理,否則有可能將觸控事件傳遞到上一層。

沒中獎彈框
public class PrizeNotWinningLayout extends RelativeLayout {

    private View mNotWinningLayout;//沒有獲獎彈框
    private RelativeLayout.LayoutParams mParams;
    private static final int MP = RelativeLayout.LayoutParams.MATCH_PARENT;
    private OnNotWinningListener mListener;
    //    private LinearLayout mBack;
    private ImageView mClose;
    private TextView mGoOn;
    private RelativeLayout mDialogLayout;

    public PrizeNotWinningLayout(Context context) {
        super(context);
        initView(context);
    }

    private void initView(Context context) {
        this.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });
        mParams = new RelativeLayout.LayoutParams(MP, MP);
        mNotWinningLayout = LayoutInflater.from(context).inflate(R.layout.prize_not_winninglayout, null);
        addView(mNotWinningLayout, mParams);
        mParams = new RelativeLayout.LayoutParams(PXUtils.getRealPixel(650), PXUtils.getRealPixel(760));
        mParams.topMargin = PXUtils.getRealPixel(160);
        mParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        mDialogLayout = (RelativeLayout) this.findViewById(R.id.prize_not_winning_dialog_layout);
        mDialogLayout.setLayoutParams(mParams);

//        mBack = (LinearLayout) mNotWinningLayout.findViewById(R.id.prize_not_winning_bar_layout);
        mClose = (ImageView) mNotWinningLayout.findViewById(R.id.not_winning_close);
        mGoOn = (TextView) mNotWinningLayout.findViewById(R.id.prize_not_winning_dialog_share);

//        mBack.setOnClickListener(mOnClickListener);
        mClose.setOnClickListener(mOnClickListener);
        mGoOn.setOnClickListener(mOnClickListener);
    }

    public void setListener(OnNotWinningListener listener) {
        mListener = listener;
    }

    private OnClickListener mOnClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
//            if (v == mBack) {
//                if (mListener != null) {
//                    mListener.back();
//                }
//            } else
            if (v == mClose) {
                if (mListener != null) {
                    mListener.closeLayout();
                }
            } else if (v == mGoOn) {
                if (mListener != null) {
                    mListener.goOn();
                }
            }
        }
    };


    public interface OnNotWinningListener {
//        void back();//返回

        void closeLayout();//關閉按鈕

        void goOn();//繼續玩
    }

}
複製程式碼

佈局檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0C0B32">

    <RelativeLayout
        android:id="@+id/prize_not_winning_dialog_layout"
        android:layout_width="325dp"
        android:layout_height="380dp"
        android:layout_marginTop="80dp"
        android:layout_centerHorizontal="true"
        android:background="@mipmap/prize_not_winning_dialog">

        <TextView
            android:id="@+id/prize_not_winning_dialog_wel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="124dp"
            android:text="沒有抽中獎品哦"
            android:textColor="#ffffffff"
            android:textSize="22dp"
            android:textStyle="bold"/>

        <TextView
            android:id="@+id/prize_not_winning_dialog_tip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/prize_not_winning_dialog_wel"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="12dp"
            android:gravity="center"
            android:text="時來運轉 再試試手氣"
            android:textColor="#ffffffff"
            android:textSize="12dp"/>

        <TextView
            android:id="@+id/prize_not_winning_dialog_share"
            android:layout_width="110dp"
            android:layout_height="30dp"
            android:layout_below="@+id/prize_not_winning_dialog_tip"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="140dp"
            android:background="@mipmap/prize_winning_btn_bg"
            android:gravity="center"
            android:text="繼續玩"
            android:textColor="#F73532"
            android:textSize="16dp"/>

    </RelativeLayout>

    <ImageView
        android:id="@+id/not_winning_close"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_below="@+id/prize_not_winning_dialog_layout"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="27dp"
        android:src="@mipmap/prize_winning_close"/>


</RelativeLayout>

複製程式碼

跟中獎彈框差不多,就是佈局不一樣而已。中獎彈框跟沒中獎彈框,讀者可以根據需求來設定不一樣的介面。

Activity

public class PrizingActivity extends BaseActivity implements View.OnClickListener {

    private TextView mPrizing;
    private RelativeLayout mLayout;
    private PrizeWinningLayout mWinningLayout;//獲獎彈框
    private PrizeNotWinningLayout mNotWinningLayout;//沒有獲獎彈框
    private RelativeLayout.LayoutParams rParams;
    private LinearLayout.LayoutParams lParams;
    private static final int WC = RelativeLayout.LayoutParams.WRAP_CONTENT;
    private static final int MP = RelativeLayout.LayoutParams.MATCH_PARENT;
    private boolean isOnBack = true;
    private TextView mRules;
    private TextView mShare;
    private Handler mHandler = new Handler();
    private int mPrizeCount = 0;
    private TextView mPrizingNum;
    private LinearLayout mLayoutBg;
    private boolean mCanPrizing = false;
    private boolean isGoOn = false;
    private LinearLayout mBack;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        setContentView(R.layout.activity_prizing);
        PXUtils.init(this);//需要註冊
        initView();
        initListener();
        getLottery();//查詢抽獎次數
    }

    /**
     * 初始化View
     */
    private void initView() {
        mLayout = (RelativeLayout) this.findViewById(R.id.prize_home_layout);
        lParams = new LinearLayout.LayoutParams(PXUtils.getRealPixel(600), PXUtils.getRealPixel(874));
        lParams.topMargin = PXUtils.getRealPixel(80);
        lParams.gravity = Gravity.CENTER_HORIZONTAL;
        mLayoutBg = (LinearLayout) this.findViewById(R.id.prize_home_bg);
        mLayoutBg.setLayoutParams(lParams);
        lParams = new LinearLayout.LayoutParams(WC, WC);
        lParams.topMargin = PXUtils.getRealPixel(316);
        TextView mTitle = (TextView) this.findViewById(R.id.prizing_title);
        mTitle.setLayoutParams(lParams);
        mPrizing = (TextView) this.findViewById(R.id.prize_taking);
        mPrizing.setOnClickListener(this);
        mRules = (TextView) this.findViewById(R.id.prize_rules);
        mRules.setOnClickListener(this);
        mShare = (TextView) this.findViewById(R.id.prizing_share_to_friend);
        mShare.setOnClickListener(this);
        mPrizingNum = (TextView) this.findViewById(R.id.prize_num);
        mBack = (LinearLayout) this.findViewById(R.id.prize_winning_bar_layout);
        mBack.setOnClickListener(this);
        //初始化獲獎彈框
        mWinningLayout = new PrizeWinningLayout(PrizingActivity.this);
        mWinningLayout.setVisibility(View.GONE);
        //初始化沒有獲獎的彈框
        mNotWinningLayout = new PrizeNotWinningLayout(PrizingActivity.this);
        mNotWinningLayout.setVisibility(View.GONE);
    }

    private void initListener() {
        //沒有中獎彈框監聽
        mNotWinningLayout.setListener(new PrizeNotWinningLayout.OnNotWinningListener() {
//            @Override
//            public void back() {
//                isOnBack = false;
//                onBackPressed();
//            }

            @Override
            public void closeLayout() {
                onBackPressed();
            }

            @Override
            public void goOn() {
                onBackPressed();
                isGoOn = true;
            }
        });
        mWinningLayout.setListener(new PrizeWinningLayout.PrizeWinningListener() {
            @Override
            public void share() {
                Intent home_intent = new Intent(PrizingActivity.this, PrizingRecordActivity.class);
                startActivity(home_intent);
            }

            @Override
            public void closeDialog() {
                onBackPressed();
            }

//            @Override
//            public void back() {
//                isOnBack = false;
//                onBackPressed();
//            }
        });
    }

    @Override
    public void onClick(View v) {
        if (v == mPrizing) {
            //中獎
            prizing();//抽獎
        } else if (v == mRules) {
            Intent rIntent = new Intent(PrizingActivity.this, PrizingRulesActivity.class);
            startActivity(rIntent);
        } else if (v == mShare) {
            Intent home_intent = new Intent(PrizingActivity.this, PrizingRecordActivity.class);
            startActivity(home_intent);
        } else if (v == mBack) {
            onBackPressed();
        }
    }

    private void prizing() {
        if (!mCanPrizing) {
            ToastUtil.show(PrizingActivity.this, "正在查詢你的抽獎次數,請稍後...");
            return;
        }
        if (mPrizeCount <= 0) {
            ToastUtil.show(PrizingActivity.this, "你的抽獎次數為0,不能抽獎");
            return;
        }
        ProgressDialogUtils.createProgressDialog(PrizingActivity.this,
                "載入中...", getProgressBarDrawable()).show();
        String url = Constant.BASE_MOBILE_LOTTERY + Constant.BASE_LOTTERY_MOTHOD + "?" + "userId=" + MemberDataMgr.getUserId(PrizingActivity.this);
        LogUtils.i("prizing_url==>", url);
        StringRequest stringRequest = new StringRequest(url,
                new Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {
                        // TODO Auto-generated method stub
                        try {
                            Gson gson = new Gson();
                            java.lang.reflect.Type type = new TypeToken<PrizingBean.PrizingLists>() {
                            }.getType();
                            final PrizingBean.PrizingLists data = gson.fromJson(response, type);
                            mHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    setDate(data);
                                }
                            });
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub
                ProgressDialogUtils.dismissProgressDialog();
                ToastUtil.show(PrizingActivity.this, "訪問出現錯誤,請檢查您的網路環境");
            }
        });
        RequestManager.getInstance(this).addRequest(stringRequest, this);
    }

    /**
     * 設定抽獎結果
     *
     * @param data
     */
    private void setDate(PrizingBean.PrizingLists data) {
        ProgressDialogUtils.dismissProgressDialog();
        if (data != null) {
            if (data.code == 0) {
                showMyDialog(data.data);
            } else {
                ToastUtil.show(PrizingActivity.this, "驗證失敗");
            }
        } else {
            ToastUtil.show(PrizingActivity.this, "訪問出現錯誤,請檢查您的網路環境");
        }
    }

    private void showMyDialog(PrizingBean.PrizingInfo data) {
        mPrizeCount--;
        setNum(mPrizeCount);
        if (data.level == 5) {
            //未中獎
            mNotWinningLayout.setVisibility(View.VISIBLE);
            rParams = new RelativeLayout.LayoutParams(MP, MP);
            mLayout.addView(mNotWinningLayout, rParams);
            mLayout.setBackgroundColor(0Xff0C0B32);
            mNotWinningLayout.startAnimation(AnimationUtils.loadAnimation(this, R.anim.animated_slide_bottom_in));
        } else {
            //中獎
            mWinningLayout.setContent(data.prize, data.awardName);
            mWinningLayout.setVisibility(View.VISIBLE);
            rParams = new RelativeLayout.LayoutParams(MP, MP);
            mLayout.addView(mWinningLayout, rParams);
            mLayout.setBackgroundColor(0Xff0C0B32);
            mWinningLayout.startAnimation(AnimationUtils.loadAnimation(this, R.anim.animated_slide_bottom_in));
        }

    }

    private Drawable getProgressBarDrawable() {

        int color = getResources().getColor(R.color.theme_color);

        return new CircularProgressDrawable.Builder(this).color(color).build();
    }

    /**
     * 查詢抽獎次數
     */
    public void getLottery() {
        String url = Constant.BASE_MOBILE_LOTTERY + Constant.BASE_LOTTERY_COUNT + "?" + "userId=" + MemberDataMgr.getUserId(PrizingActivity.this);
        LogUtils.i("prizing_url==>", url);
        StringRequest stringRequest = new StringRequest(url,
                new Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {
                        // TODO Auto-generated method stub
                        try {
                            Gson gson = new Gson();
                            java.lang.reflect.Type type = new TypeToken<PrizingBean.PrizingCount>() {
                            }.getType();
                            final PrizingBean.PrizingCount data = gson.fromJson(response, type);
                            mHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    setCount(data);
                                }
                            });
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub
                mCanPrizing = true;
                ProgressDialogUtils.dismissProgressDialog();
                ToastUtil.show(PrizingActivity.this, "訪問出現錯誤,請檢查您的網路環境");
            }
        });
        RequestManager.getInstance(this).addRequest(stringRequest, this);
    }

    /**
     * 設定查詢次數
     *
     * @param count
     */
    public void setCount(PrizingBean.PrizingCount count) {
        mCanPrizing = true;
        if (count != null) {
            if (count.code == 0) {
                mPrizeCount = count.data;
                setNum(mPrizeCount);
            } else {
                ToastUtil.show(PrizingActivity.this, "查詢抽獎次數失敗");
            }
        } else {
            ToastUtil.show(PrizingActivity.this, "訪問出現錯誤,請檢查您的網路環境");
        }

    }

    /**
     * 提示抽獎次數
     *
     * @param count
     */
    private void setNum(int count) {
        if (count >= 0) {
            mPrizingNum.setText("有 " + count + " 抽獎機會");
        }
    }


    @Override
    public void onBackPressed() {
        if (isOnBack && mWinningLayout != null && mWinningLayout.getVisibility() == View.VISIBLE) {
            isOnBack = false;
            TranslateAnimation animation = (TranslateAnimation) AnimationUtils.loadAnimation(this, R.anim.animated_slide_bottom_out);
            mWinningLayout.startAnimation(animation);
            animation.setAnimationListener(new Animation.AnimationListener() {

                @Override
                public void onAnimationStart(Animation animation) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onAnimationRepeat(Animation animation) {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    // TODO Auto-generated method stub
                    isOnBack = true;
                    mLayout.removeView(mWinningLayout);
                    mWinningLayout.setVisibility(View.GONE);
                    mLayout.setBackgroundColor(0XFF151463);
                }
            });
            return;
        }
        if (isOnBack && mNotWinningLayout != null && mNotWinningLayout.getVisibility() == View.VISIBLE) {
            isOnBack = false;
            TranslateAnimation animation = (TranslateAnimation) AnimationUtils.loadAnimation(this, R.anim.animated_slide_bottom_out);
            mNotWinningLayout.startAnimation(animation);
            animation.setAnimationListener(new Animation.AnimationListener() {

                @Override
                public void onAnimationStart(Animation animation) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onAnimationRepeat(Animation animation) {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    // TODO Auto-generated method stub
                    isOnBack = true;
                    mLayout.removeView(mNotWinningLayout);
                    mNotWinningLayout.setVisibility(View.GONE);
                    mLayout.setBackgroundColor(0XFF151463);
                    if (isGoOn) {
                        prizing();//抽獎
                        isGoOn = false;
                    }
                }
            });
            return;
        }
        super.onBackPressed();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

}
複製程式碼

這裡主要是通過addView和removeView的方式將彈框add進來,並且設定彈框動畫即可,還需要設定彈框的回撥事件,讓彈框的點選事件可以讓使用者點選。

抽獎流程:

1、查詢抽獎次數

2、判斷是否可以抽獎

3、抽獎

4、根據是否中獎進行彈框。

Activity佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/prize_home_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF151463"
    android:fitsSystemWindows="true"
    tools:context="com.joymain.jmobile.activity.PrizingActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/prize_home_bg"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/prize_home_bg"
            android:layout_width="300dp"
            android:layout_height="450dp"
            android:layout_marginTop="40dp"
            android:layout_gravity="center_horizontal"
            android:background="@mipmap/prize_home_dialog"
            android:gravity="center_horizontal"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="黃金十月,鑽石相約"
                android:textColor="#B1019A"
                android:textSize="15dp"/>

            <TextView
                android:id="@+id/prizing_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="158dp"
                android:text="10萬大獎等你來拿"
                android:textColor="#F96E6F"
                android:textSize="20dp"
                android:textStyle="bold"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="3dp"
                android:text="JM獨家定製名貴臻品鑽石"
                android:textColor="#ff000000"
                android:textSize="12dp"/>

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:layout_marginTop="10dp"
                android:src="@mipmap/prize_home_icon"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:text="新加入家人即可抽獎"
                android:textSize="12dp"/>

            <TextView
                android:id="@+id/prize_taking"
                android:layout_width="120dp"
                android:layout_height="35dp"
                android:layout_marginBottom="5dp"
                android:layout_marginTop="6dp"
                android:background="@mipmap/prize_home_take_bg"
                android:gravity="center"
                android:text="抽獎"
                android:textColor="#FEE210"/>

            <TextView
                android:id="@+id/prize_num"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="有0次抽獎機會"
                android:textColor="#FFFE9FA0"
                android:textSize="12dp"/>
        </LinearLayout>


        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="16dp"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/prize_rules"
                android:layout_width="60dp"
                android:layout_height="20dp"
                android:background="@mipmap/prize_home_rules"
                android:gravity="center"
                android:text="抽獎規則"
                android:textColor="#FE9FA0"
                android:textSize="10dp"/>

            <View
                android:layout_width="1dp"
                android:layout_height="20dp"
                android:layout_marginLeft="5dp"
                android:background="#ffffffff"/>

            <TextView
                android:id="@+id/prizing_share_to_friend"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="檢視獲獎記錄"
                android:padding="4dp"
                android:textColor="#ffffffff"
                android:textSize="10dp"/>
        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:id="@+id/prize_winning_bar_layout"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_alignParentLeft="true"
        android:paddingRight="10dp"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginLeft="15dp"
            android:layout_gravity="center_vertical"
            android:src="@mipmap/prize_winning_back"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="返回"
            android:textColor="#ffffffff"
            android:textSize="16dp"/>
    </LinearLayout>

</RelativeLayout>

複製程式碼

中獎列表就是一個RecyclerView,再次就不需要給出來了,讀者可以自行完成。

另外一個彈框實現方式

除了以上的彈框方式,其實還可以使用Dialog來實現彈框。自定義彈框內容,將定義的View通過Dialog的setContentView來add進去。

CustomPrizeDialog:

public class CustomPrizeDialog {

    private Dialog mDialog;
    private ContentView mContentView;
    private Context mContext;
    private int defTextSize = 15;
    private int defOKBtnTextSize = 15;
    private int defTop = 65;
    private int defBottom = 40;
    private int defSpace = 30;
    private int defLineSpace = 4;
    private int contentHorizontalMargin = 50;

    public CustomPrizeDialog(Context context) {
        initDialog(context);
    }

    public CustomPrizeDialog(Context context, AttributeSet attrs) {
        initDialog(context);
    }

    public CustomPrizeDialog(Context context, AttributeSet attrs, int defStyle) {
        initDialog(context);
    }

    private void initDialog(Context context) {
        mContext = context;
        mDialog = new Dialog(context, R.style.custom_alter_dialog);
        Window window = mDialog.getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        window.setAttributes(lp);
        window.setGravity(Gravity.CENTER);
        mContentView = new ContentView(context);
        mDialog.setContentView(mContentView);
        mDialog.setCancelable(true);
        mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {

            @Override
            public void onDismiss(DialogInterface dialog) {
                if (mOnDismissListener != null) {
                    mOnDismissListener.onDismiss(dialog);
                }
            }
        });
    }


    public void setCanceledOnTouchOutside(boolean cancel) {
        mDialog.setCanceledOnTouchOutside(cancel);
    }

    private DialogInterface.OnDismissListener mOnDismissListener;

    public void setOnDismissListener(DialogInterface.OnDismissListener l) {
        mOnDismissListener = l;
    }

    public void show() {
        if (mContext != null && !((Activity) mContext).isFinishing()) {
            mDialog.show();
        }
    }

    public void dismiss() {
        mDialog.dismiss();
    }

    public void setContentView(View view) {
        mContentView.setContentView(view);
    }

    public void setContentView(View view, LinearLayout.LayoutParams params) {
        mContentView.setContentView(view, params);
    }

    public void addCustomView(View view, LinearLayout.LayoutParams params) {
        mContentView.addCustomView(view, params);
    }

    public void setPositiveButton(String text, View.OnClickListener l) {
        mContentView.setPositiveButton(l);
    }

    public void setClickDismissEnabled(boolean dismissAble) {
        mContentView.setClickDismissEnabled(dismissAble);
    }


    public void setText(String text1, String text2) {
        setText(text1, defTextSize, text2, defTextSize);
    }


    public void setText(String text1, int size1, String text2, int size2) {
        setText(text1, size1, Gravity.CENTER_HORIZONTAL, text2, size2, Gravity.CENTER_HORIZONTAL);
    }


    public void setText(String text1, int size1, int gravity1, String text2, int size2, int gravity2) {
        setText(text1, size1, gravity1, text2, size2, gravity2, defSpace);
    }


    public void setText(String text1, int size1, int gravity1, String text2, int size2, int gravity2, int space) {
        mContentView.setText(text1, size1, gravity1, text2, size2, gravity2, space);
    }



    public void setText(String text, int size, int gravity) {
        mContentView.setText(null, 0, Gravity.CENTER_HORIZONTAL, text, size, gravity, 0);
    }

    public void setText(String text, int size) {
        mContentView.setText(null, 0, Gravity.CENTER_HORIZONTAL, text, size, Gravity.CENTER_HORIZONTAL, 0);
    }


    private class ContentView extends RelativeLayout {

        private LinearLayout mContent;
        private LinearLayout mContentView;
        private ImageView close;
        private OnClickListener mPositiveClickListener;
        private ScrollView mScrollView;
        private boolean mClickDismissAble = true;

        public ContentView(Context context) {
            super(context);
            initialize(context);
        }

        public void setClickDismissEnabled(boolean enabled) {
            mClickDismissAble = enabled;
        }

        private void initialize(Context context) {

            LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.CENTER_IN_PARENT);
            mContentView = new LinearLayout(context);
            mContentView.setId(R.id.content_id);
            mContentView.setBackgroundResource(R.drawable.prize_winning_dialog);
            addView(mContentView, params);
            mContentView.setOrientation(LinearLayout.VERTICAL);

            LayoutParams lparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            mScrollView = new ScrollView(context);
            mContentView.addView(mScrollView, lparams);
            mScrollView.setVerticalFadingEdgeEnabled(false);


            mContent = new LinearLayout(context);
            mContent.setPadding(0, defTop, 0, defBottom);
            FrameLayout.LayoutParams fl_lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            mScrollView.addView(mContent, fl_lp);
            mContent.setOrientation(LinearLayout.VERTICAL);


            params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.CENTER_HORIZONTAL);
            params.addRule(RelativeLayout.BELOW,mContentView.getId());
            params.topMargin = 200;
            close = new ImageView(context);
            close.setOnClickListener(mOnClickListener);
            close.setImageResource(R.drawable.prize_close);
            addView(close, params);
        }

        public void setPositiveButton(OnClickListener l) {
            mPositiveClickListener = l;
        }

        public void setText(String text1, int size1, int gravity1, String text2, int size2, int gravity2, int space) {
            mContent.removeAllViews();
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            params.leftMargin = 60;
            params.rightMargin = 60;
            params.topMargin = 250;
            params.gravity = Gravity.CENTER_HORIZONTAL;
            TextView tv = new TextView(getContext());
            tv.setText("恭喜你");
            tv.setTextColor(0xffffffff);
            tv.setGravity(Gravity.CENTER_HORIZONTAL);
            tv.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
            mContent.addView(tv, params);

            TextView tv1 = new TextView(getContext());
            tv1.getPaint().setFakeBoldText(true);
            tv1.setTextColor(0xFFFDD649);
            tv1.setGravity(gravity1);
            tv1.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size1);
            TextView tv2 = new TextView(getContext());
            tv2.setTextColor(0xffffffff);
            tv2.setLineSpacing(defLineSpace, 1.0f);//行距12
            tv2.setGravity(gravity2);
            tv2.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size2);
            if (text1 != null && text1.length() > 0 && text2 != null && text2.length() > 0) {
                params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                params.leftMargin = 60;
                params.rightMargin = 60;
                params.topMargin = 10;
                params.bottomMargin = space;
                tv1.setText(text1);
                mContent.addView(tv1, params);

                params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                params.leftMargin = contentHorizontalMargin;
                params.rightMargin = contentHorizontalMargin;
                tv2.setText(text2);
                mContent.addView(tv2, params);
            } else if (text1 != null && text1.length() > 0) {
                params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                params.leftMargin = 60;
                params.rightMargin = 60;
                tv1.setText(text1);
                mContent.addView(tv1, params);
            } else if (text2 != null && text2.length() > 0) {
                params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                params.leftMargin = contentHorizontalMargin;
                params.rightMargin = contentHorizontalMargin;
                tv2.setText(text2);
                mContent.addView(tv2, params);
            }

        }


        public void setContentView(View view) {
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            setContentView(view, params);
        }

        public void setContentView(View view, LinearLayout.LayoutParams params) {
            mContent.removeAllViews();
            mContent.addView(view, params);
        }

        public void addCustomView(View view, LinearLayout.LayoutParams params) {
            mContent.addView(view, params);
        }

        private OnClickListener mOnClickListener = new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (v == close) {
                    if (mPositiveClickListener != null) {
                        mPositiveClickListener.onClick(CustomPrizeDialog.ContentView.this);
                    }
                    if (mClickDismissAble) {
                        dismiss();
                    }
                }
            }

        };
    }

    public interface onBackKeyListener {
        public void onBack();
    }

    public void setonBackKeyListener(final onBackKeyListener backKeyListener) {
        mDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    backKeyListener.onBack();
                    return true;
                }
                return false;
            }
        });
    }


}
複製程式碼

dialog的樣式

<style name="custom_alter_dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
 <!--<item name="android:windowBackground">@color/dialog_bg_color</item>-->
 <item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.6</item>
</style>
複製程式碼

這裡並沒有直接使用xml來佈局,而是直接使用java來編寫佈局。同樣需要設定裡面需要的點選事件的回撥即可。

View

相關文章