package external.otherview; import java.lang.ref.WeakReference; import com.aiyou.AiYouApplication; import com.aiyou.R; import com.aiyou.utils.AiYouManager; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.FrameLayout; public class SinkingView extends FrameLayout { public enum Status { RUNNING, NONE } private static final int DEFAULT_TEXTCOLOT = 0xff0074a2; private static final int DEFAULT_TEXTSIZE = AiYouManager.getInstance( AiYouApplication.getInstance()).sp2px(20); private static WeakReference<Bitmap> mScaledBitmap; private static int mRepeatCount = 0; private float mPercent; private Paint mPaint = new Paint(); private float mLeft; private int mSpeed = 10; private Status mFlag = Status.NONE; private int mTextColot = DEFAULT_TEXTCOLOT; private int mTextSize = DEFAULT_TEXTSIZE; public SinkingView(Context context) { super(context); } public SinkingView(Context context, AttributeSet attrs) { super(context, attrs); } public SinkingView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setTextColor(int color) { mTextColot = color; } public void setTextSize(int size) { mTextSize = size; } public float getPercent() { return mPercent; } public void setPercent(float percent) { mFlag = Status.RUNNING; mPercent = percent; postInvalidate(); } public void setStatus(Status status) { mFlag = status; } public void clear() { mFlag = Status.NONE; } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (mFlag == Status.RUNNING) { if (mScaledBitmap == null || mScaledBitmap.get() == null || mScaledBitmap.get().isRecycled()) { initScaledBmp(); } for (int idx = 0; idx < mRepeatCount; idx++) { canvas.drawBitmap(mScaledBitmap.get(), mLeft + (idx - 1) * mScaledBitmap.get().getWidth(), -mPercent * getHeight(), null); } String str = (int) (mPercent * 100) + "%"; mPaint.setColor(mTextColot); mPaint.setTextSize(mTextSize); canvas.drawText(str, (getWidth() - mPaint.measureText(str)) / 2, getHeight() / 2 + mTextSize / 2, mPaint); mLeft += mSpeed; if (mLeft >= mScaledBitmap.get().getWidth()) mLeft = 0; postInvalidateDelayed(20); } } private synchronized void initScaledBmp() { if (mScaledBitmap != null && mScaledBitmap.get() != null && !mScaledBitmap.get().isRecycled()) { return; } Bitmap bmp = null; try { bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.wave); bmp = Bitmap.createScaledBitmap(bmp, bmp.getWidth(), getHeight(), false); mRepeatCount = (int) Math.ceil(getWidth() / bmp.getWidth() + 0.5) + 1; } catch (OutOfMemoryError e) { bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.touch_image_view); } mScaledBitmap = new WeakReference<Bitmap>(bmp); } }