/** * Copyright (c) 2013-2014, Rinc Liu (http://rincliu.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.rincliu.library.widget.viewflow; import com.rincliu.library.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.os.AsyncTask; import android.util.AttributeSet; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Animation.AnimationListener; public abstract class BaseIndicator extends View implements ViewFlow.ViewSwitchListener { private ViewFlow viewFlow; private int position = 0; private int fadeOutTime = -1; private FadeTimer timer; private float innerMargin = 3; /** * @param context * @param attrs */ protected BaseIndicator(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Indicator); innerMargin = typedArray.getDimension(R.styleable.Indicator_innerMargin, 3.0f); if (innerMargin < 0) { throw new IllegalArgumentException("InnerMargin should be larger than 0."); } fadeOutTime = typedArray.getInt(R.styleable.Indicator_fadeOutTime, -1); typedArray.recycle(); } /** * @param fadeOutTime */ public void setFadeOutTime(int fadeOutTime) { this.fadeOutTime = fadeOutTime; } /** * @return */ protected float getInnerMargin() { return innerMargin; } /** * @return */ protected ViewFlow getViewFlow() { return viewFlow; } /** * @return */ protected int getPosition() { return position; } /* * (non-Javadoc) * @see android.view.View#onDraw(android.graphics.Canvas) */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (getViewFlow() == null) { return; } } /* * (non-Javadoc) * @see android.view.View#onMeasure(int,int) */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (viewFlow == null) { return; } setMeasuredDimension(onMeasureWidth(widthMeasureSpec), onMeasureHeight(heightMeasureSpec)); } /** * @param measureSpec * @return */ protected abstract int onMeasureWidth(int measureSpec); /** * @param measureSpec * @return */ protected abstract int onMeasureHeight(int measureSpec); @Override public void setViewFlow(ViewFlow view) { resetTimer(); viewFlow = view; invalidate(); } @Override public void onScrolled(int h, int v, int oldh, int oldv) { setVisibility(View.VISIBLE); resetTimer(); if (viewFlow != null && viewFlow.getWidth() > 0) { position = h / viewFlow.getWidth(); } invalidate(); } @Override public void onSwitched(View view, int position) {} private void resetTimer() { if (fadeOutTime > 0) { if (timer == null || timer.isRun == false) { timer = new FadeTimer(); timer.execute(); } else { timer.resetTimer(); } } } private class FadeTimer extends AsyncTask<Void, Void, Void> { private int timer = 0; private boolean isRun = true; public void resetTimer() { timer = 0; } @Override protected Void doInBackground(Void... arg0) { while (isRun) { try { Thread.sleep(1); timer++; if (timer == fadeOutTime) { isRun = false; } } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(Void result) { Animation animation = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_out); animation.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation animation) { setVisibility(View.INVISIBLE); } @Override public void onAnimationRepeat(Animation animation) {} @Override public void onAnimationStart(Animation animation) {} }); startAnimation(animation); } } }