package com.novelbook.android.AD; import android.widget.FrameLayout; import android.content.Context; import android.graphics.Color; import android.os.CountDownTimer; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; public class AdvertisementView extends FrameLayout { private final static String DEFAULT_COUNT_DOWN_FORMATTER_LABEL = "%1$ds\u2000跳过"; /** * the code of clicking advertisement image */ public final static int ACTION_CODE_PREVIEW = 0x00; /** * the code of clicking jump_button */ public final static int ACTION_CODE_JUMP = 0x01; /** * the code of finishing count down timer */ public final static int ACTION_CODE_FINISH = 0x02; private AppCompatImageView imageView; private TextView textView; private OnComponentActionListener onComponentActionListener; private long millisInFuture; private long countDownInterval; private AdvertisementCountDownTimer advertisementCountDownTimer; private String countDownFormatterLabel = DEFAULT_COUNT_DOWN_FORMATTER_LABEL; public AdvertisementView(@NonNull Context context) { this(context, null); } public AdvertisementView(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public AdvertisementView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context) { int dp8 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()); imageView = new AppCompatImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); textView = new TextView(context); textView.setTextColor(Color.WHITE); textView.setGravity(Gravity.CENTER); textView.setPadding(dp8 * 2, 0, dp8 * 2, 0); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f); // textView.setBackgroundResource(R.drawable.kit_jump_background_shape); addView(imageView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, dp8 * 3); params.gravity = Gravity.END; params.rightMargin = dp8 * 2; params.topMargin = dp8 * 2; addView(textView, params); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cancelCountDown(); if (onComponentActionListener != null) { onComponentActionListener.onComponentAction(ACTION_CODE_PREVIEW, v); } } }); textView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cancelCountDown(); if (onComponentActionListener != null) { onComponentActionListener.onComponentAction(ACTION_CODE_JUMP, v); } } }); } /** * Because this is a formatter string, so it look like:"%1$d...". * * @param countDownFormatterLabel the formatter string * @see java.util.Formatter */ public void setCountDownFormatterLabel(String countDownFormatterLabel) { this.countDownFormatterLabel = countDownFormatterLabel; } public String getCountDownFormatterLabel() { return countDownFormatterLabel; } public AppCompatImageView getImageView() { return imageView; } /** * @param millisInFuture future time * @param countDownInterval interval count down step * @param onComponentActionListener action listener */ public void init(long millisInFuture, long countDownInterval, OnComponentActionListener onComponentActionListener) { this.millisInFuture = millisInFuture; this.countDownInterval = countDownInterval; this.onComponentActionListener = onComponentActionListener; textView.setText(String.format(countDownFormatterLabel, millisInFuture / 1000)); } public void startCountDown() { if (advertisementCountDownTimer == null) { advertisementCountDownTimer = new AdvertisementCountDownTimer(millisInFuture, countDownInterval); } advertisementCountDownTimer.start(); } public void cancelCountDown() { if (advertisementCountDownTimer != null) { advertisementCountDownTimer.cancel(); advertisementCountDownTimer = null; } } public interface OnComponentActionListener { void onComponentAction(int actionCode, View view); } private class AdvertisementCountDownTimer extends CountDownTimer { AdvertisementCountDownTimer(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); } @Override public void onTick(long millisUntilFinished) { long s = millisUntilFinished / 1000; textView.setText(String.format(countDownFormatterLabel, s)); } @Override public void onFinish() { textView.setText(String.format(countDownFormatterLabel, 0L)); textView.setEnabled(false); cancelCountDown(); if (onComponentActionListener != null) { onComponentActionListener.onComponentAction(ACTION_CODE_FINISH, textView); } } } }