QieZi sharecenter surface progress bar

package com.lenovo.anyshare.widget;

import com.lenovo.common.Logger;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

public class RadarScannerSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private static final int TIME_INTERNAL = 100;

    private SurfaceTread mThread;
    private boolean mIsInAnimation = true;
    private View mCenterView;
    private Paint mLinePaint;

    private int mWidth = 0;
    private int mTop = 0;
    private int mLeft = 0;

    private Style mLinePaintStyle = Style.FILL;
    private int mTransparency = 0xFF;
    private int mRed = 0xff;
    private int mGreen = 0xff;
    private int mBlue = 0xff;

    private int mCurIndex[] = { 0, 0, 0, 0 };
    private float mTime[] = { 0, 0.8f, 1.6f, 2.4f };

    private int mV0 = 10;
    private int mAcc = 150;
    private int mInterval = 0;

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

    public RadarScannerSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public RadarScannerSurfaceView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
    }

    public void setStyle(Style style, int transparency, int red, int green, int blue) {
        mLinePaintStyle = style;
        mTransparency = transparency;
        mRed = red;
        mGreen = green;
        mBlue = blue;

        mLinePaint.setStyle(mLinePaintStyle);
    }

    private void initView(Context context) {
        setWillNotDraw(false);
        getHolder().addCallback(this);

        mLinePaint = new Paint();
        mLinePaint.setAntiAlias(true);
        mLinePaint.setStyle(mLinePaintStyle);
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        drawCanvas(canvas);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mThread = new SurfaceTread(holder);
        mThread.mIsRun = true;
        mThread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mThread.mIsRun = false;
        mThread.interrupt();
    }

    public void setAlignView(View view) {
        mCenterView = view;
        this.postInvalidate();
    }

    public void startAnimation() {
//        for (int i = 0; i < mTime.length; i++) {
//            mTime[i] = mInterval * i;
//        }
        mIsInAnimation = true;
    }

    public void stopAnimation() {
//        for (int i = 0; i < mTime.length; i++) {
//            mTime[i] = mInterval * i;
//        }
        mIsInAnimation = false;
        this.postInvalidate();
    }

    private void drawCanvas(Canvas canvas) {
        if (mCenterView != null) {
            mTop = mCenterView.getTop();
            mLeft = mCenterView.getLeft();
            mWidth = mCenterView.getWidth();
        } else {
            mLeft = 0;
            mTop = canvas.getHeight() / 2;
            mWidth = canvas.getWidth();
        }
        
        Logger.v("xiaxing", "mWidth : " + mWidth);

        if (!mIsInAnimation)
            return;

        Rect line = new Rect();
        mCenterView.getHitRect(line);
        int color = Color.argb(0xff, 0x24, 0xde, 0xff);
        mLinePaint.setColor(color);
        canvas.drawRect(line, mLinePaint);

        color = Color.argb(mTransparency, mRed, mGreen, mBlue);
        mLinePaint.setColor(color);
        canvas.drawRect(mLeft + mCurIndex[0], mTop, mLeft + 6 + mCurIndex[0], mTop + 4, mLinePaint);

        color = Color.argb(mTransparency, mRed, mGreen, mBlue);
        mLinePaint.setColor(color);
        canvas.drawRect(mLeft + mCurIndex[1], mTop, mLeft + 6 + mCurIndex[1], mTop + 4, mLinePaint);

        color = Color.argb(mTransparency, mRed, mGreen, mBlue);
        mLinePaint.setColor(color);
        canvas.drawRect(mLeft + mCurIndex[2], mTop, mLeft + 6 + mCurIndex[2], mTop + 4, mLinePaint);

        color = Color.argb(mTransparency, mRed, mGreen, mBlue);
        mLinePaint.setColor(color);
        canvas.drawRect(mLeft + mCurIndex[3], mTop, mLeft + 6 + mCurIndex[3], mTop + 4, mLinePaint);
    }

    public class SurfaceTread extends Thread {
        public boolean mIsRun = false;
        private SurfaceHolder mHolder;

        public SurfaceTread(SurfaceHolder holder) {
            this.mHolder = holder;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(600);
            } catch (InterruptedException e) {}

            while (mIsRun) {
                if (!mIsInAnimation || !mHolder.getSurface().isValid()) {
                    try {
                        Thread.sleep(TIME_INTERNAL);
                    } catch (InterruptedException e) {}
                    continue;
                }

                RadarScannerSurfaceView.this.postInvalidate();

                try {
                    Thread.sleep(TIME_INTERNAL);
                } catch (InterruptedException e) {}

                // s = v0*t + a * t2 / 2
                for (int i = 0; i < mCurIndex.length; i++) {
                    if (mCurIndex[i] > mWidth)
                        mTime[i] = 0;

                    mTime[i] = mTime[i] + 0.1f;
                    mCurIndex[i] = (int)(mV0 * mTime[i] + mAcc * mTime[i] * mTime[i] / 2);
                }
            }
        }
    };
}

猜你喜欢

转载自xiaxingwork.iteye.com/blog/2076640
bar