WaterColourVoiceView

WaterColourVoiceView

package com.reacnnCn.android.view;

import com.reacnnCn.android.R;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.RadialGradient;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.Style;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
 

public class WaterColourVoiceView extends ImageView implements Runnable {

	Paint mPaint = null;
	private final Paint mpaint = new Paint();
	private final Paint mCirclePaint = new Paint();

	private int mBorderThickness = 2;
	/**
	 * 内圆或者外圆的边框颜色
	 */
	private int mBorderColor = android.graphics.Color.YELLOW;
	/**
	 * 滑块颜色
	 */
	private int mSlidercolor = 0xffff73c9;

	private Rect mRect = null;

	private int DefaultMinSecond = 5;

	public WaterColourVoiceView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(context);
	}

	public WaterColourVoiceView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}

	public WaterColourVoiceView(Context context) {
		super(context);
		init(context);
	}

	void init(Context mContext) {
		mPaint = new Paint();
		mPaint.setAntiAlias(true);
		mPaint.setColor(0x40cccccc);
		new Thread(this).start();
		this.mpaint.setAntiAlias(true);
		this.mpaint.setStyle(Style.STROKE);
		mCirclePaint.setAntiAlias(true);
		if (isInEditMode()) {
			isDraw = true;
			mBorderThickness = 4;
		} else {
			mBorderThickness = mContext.getResources().getDimensionPixelSize(R.dimen.rotatethiness);
		}
	}

	/**
	 * 线程处理
	 */
	public void run() {
		while (!Thread.currentThread().isInterrupted()) {
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				Thread.currentThread().interrupt();
			}
			postInvalidate();
		}
	}

	int startAngle = 0;

	public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
		Bitmap scaledSrcBmp;
		int diameter = radius * 2;
		if (bmp.getWidth() != diameter || bmp.getHeight() != diameter)
			scaledSrcBmp = Bitmap.createScaledBitmap(bmp, diameter, diameter,
					false);
		else
			scaledSrcBmp = bmp;
		Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),
				scaledSrcBmp.getHeight(), Config.ARGB_8888);
		Canvas canvas = new Canvas(output);

		final Paint paint = new Paint();
		final Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(),
				scaledSrcBmp.getHeight());

		paint.setAntiAlias(true);
		paint.setFilterBitmap(true);
		paint.setDither(true);
		canvas.drawARGB(0, 0, 0, 0);
		paint.setColor(Color.parseColor("#BAB399"));
		canvas.drawCircle(scaledSrcBmp.getWidth() / 2,
				scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2,
				paint);
		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
		canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
		return output;
	}

	private boolean isDraw = true;

	final int iStartPosition = 35;
	int iPosition = iStartPosition;

	@SuppressLint("DrawAllocation")
	@Override
	protected void onDraw(Canvas canvas) {
		Drawable drawable = getDrawable();
		if (drawable == null) {
			return;
		}
		if (getWidth() == 0 || getHeight() == 0) {
			return;
		}
		this.measure(0, 0);

		if (drawable.getClass() == NinePatchDrawable.class)
			return;

		Bitmap b = ((BitmapDrawable) drawable).getBitmap();
		Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

		int TinkissWidth = 2;
		int ww = getWidth(), hh = getHeight();
		int radiusr = iStartPosition * TinkissWidth - mBorderThickness - 1;
		int radius = (ww < hh ? ww : hh) / 2; // 最外围的半径

		if (isWateDraw) {
			iPosition += 1;
			if (iPosition > (radius / TinkissWidth)) {
				iPosition = iStartPosition;
			}
			mCirclePaint.setShader(new RadialGradient(ww / 2, hh / 2, radius,
					new int[] { 0x60cccccc, 0x00000000 }, null,
					Shader.TileMode.MIRROR));
			canvas.drawCircle(ww / 2, hh / 2, iPosition * TinkissWidth + 1,
					mCirclePaint);
			mPaint.setColor(Color.WHITE);
			canvas.drawCircle(ww / 2, hh / 2, (iPosition - 1) * TinkissWidth,
					mPaint);
		}

		Bitmap roundBitmap = getCroppedBitmap(bitmap, radiusr);
		final Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setFilterBitmap(true);
		paint.setDither(true);

		paint.setColor(android.graphics.Color.GREEN);
		canvas.drawCircle(ww / 2, hh / 2, radiusr + mBorderThickness + 1, paint);
		paint.setColor(mBorderColor);
		// 外围边框
		canvas.drawCircle(ww / 2, hh / 2, radiusr + mBorderThickness, paint);
		canvas.drawBitmap(roundBitmap, ww / 2 - radiusr, hh / 2 - radiusr, null);
		double mlength = Math.PI * 2 * radiusr;
		DefaultMinSecond = (int) (mlength / 20);
		if (isInEditMode()) {
			mpaint.setColor(mSlidercolor);

			mpaint.setStrokeWidth(mBorderThickness);
			mpaint.setAntiAlias(true);
			mpaint.setDither(true);

			RectF rect2 = new RectF(ww / 2 - radiusr - 2, hh / 2 - radiusr - 2,
					ww / 2 + radiusr + mBorderThickness - 2, hh / 2 + radiusr
							+ mBorderThickness - 2);

			canvas.drawArc(rect2, 270, 30, false, mpaint);
			canvas.drawArc(rect2, 90, 30, false, mpaint);
			canvas.drawArc(rect2, 0, 30, false, mpaint);
			canvas.drawArc(rect2, 180, 30, false, mpaint);
			canvas.drawArc(rect2, 45, 30, false, mpaint);
			canvas.drawArc(rect2, 135, 30, false, mpaint);
			canvas.drawArc(rect2, 225, 30, false, mpaint);
			canvas.drawArc(rect2, 315, 30, false, mpaint);
		}

		if (mRect == null) {
			mRect = new Rect(ww / 2 - radiusr, hh / 2 - radiusr, ww / 2
					+ radiusr + mBorderThickness, hh / 2 + radiusr
					+ mBorderThickness);
		}
		if (!isDraw) {
			mpaint.setColor(mSlidercolor);
			mpaint.setStrokeWidth(mBorderThickness);
			mpaint.setAntiAlias(true);
			mpaint.setDither(true);
			RectF rect2 = new RectF(ww / 2 - radiusr - 2, hh / 2 - radiusr - 2,
					ww / 2 + radiusr + mBorderThickness - 2, hh / 2 + radiusr
							+ mBorderThickness - 2);
			canvas.drawArc(rect2, startAngle, 20, false, mpaint);
			startAngle += 5;
			if (startAngle == 360)
				startAngle = 0;
			if (isStart) {
				isDraw = false;
				invalidate();
			}
		}
	}

	Shader mSweepGradient = null;

	private boolean isWateDraw = true;
	Object mObject2 = new Object();

	public void StartWate() {
		synchronized (mObject2) {
			iPosition = iStartPosition;
			isWateDraw = true;
			invalidate();
		}
	}

	public void StopWate() {
		synchronized (mObject2) {
			iPosition = iStartPosition;
			isWateDraw = false;
			invalidate();
		}
	}

	public void toggleWate() {
		if (isWateDraw) {
			StopWate();
		} else {
			StartWate();
		}
	}

	public void toggle() {
		if (isStart) {
			Stop();
		} else {
			Start();
		}
	}

	public void Begin(int minseconds) {
		StartWate();
		iPosition = iStartPosition;
		mHandler.sendMessageDelayed(mHandler.obtainMessage(1),
				minseconds * 1000);
	}

	@SuppressLint("HandlerLeak")
	Handler mHandler = new Handler() {
		public void dispatchMessage(android.os.Message msg) {
			super.dispatchMessage(msg);
			switch (msg.what) {
			case 1:
				StopWate();
				beginTrans();
				setImageDrawable(getResources().getDrawable(R.drawable.app));
				break;
			case 2:
				Stop();
				break;
			default:
				break;
			}
		};
	};

	private void beginTrans() {
		Start();
		mHandler.sendMessageDelayed(mHandler.obtainMessage(2), 5000);
	}

	public void End() {
		StopWate();
		Stop();
	}

	private boolean isStart = false;
	Object mObject = new Object();

	public void Start() {
		synchronized (mObject) {
			isStart = true;
			isDraw = false;
			invalidate();
		}
	}

	public void Stop() {
		synchronized (mObject) {
			isStart = false;
			isDraw = true;
			invalidate();
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			if (mRect != null) {
				if (mRect.contains((int) event.getX(), (int) event.getY())) {
					Log.e(VIEW_LOG_TAG, "Click");
					BitmapClick();
				} else {
					Log.e(VIEW_LOG_TAG, "Not Click");
				}
			} else {
				Log.e(VIEW_LOG_TAG, "mRect=null");
			}
		}
		return super.onTouchEvent(event);
	}

	private void BitmapClick() {
		Begin(DefaultMinSecond);
		setImageDrawable(getResources().getDrawable(R.drawable.app));
		if (mClickListener != null) {
			mClickListener.OnClickListener(this);
		}
	}

	private OnVoiceClickListener mClickListener = null;

	public void SetOnVoiceClickListener(
			OnVoiceClickListener mOnVoiceClickListener) {
		this.mClickListener = mOnVoiceClickListener;
	}

	public interface OnVoiceClickListener {
		void OnClickListener(View view);

		void BeginVoiceListener(View view);

		void EndVoiceListener(View view);

		void BeginRotatingListener(View view);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值