164 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			164 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | 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); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |