package com.wistron.WiCamera;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.BitmapFactory.Options;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import com.wistron.WiViewer.TDStaticData;
import com.wistron.swpc.wicamera3dii.R;
/**
* 拨动按钮的普通版
* @author WH1107028
*
*/
public class SlideButton extends View {
private static final String NAMESPACE = "http://www.pro.dev.com/common";
private boolean mNowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭
private boolean mOnSlip = false;//记录用户是否在滑动的变量
private float mDownX = 0,
mNowX = 0; //按下时的x,当前的x,
private Rect mBtnOn = null,
mBtnOff = null; //打开和关闭状态下,游标的Rect
private boolean mIsChangeListenerOn = false;
private OnCheckedChangedListener mOnChangeListener;
private boolean mIsPressed = false;
private boolean mIsEnable = true;
private Bitmap mBgOn = null,
mBgOff = null,
mSlipOn = null,
mSlipOff = null,
mSlipOnHint = null,
mSlipOffHint = null,
mSlipButton = null,
mBgOnOriginal = null,
mBgOffOriginal = null,
mSlipOnOriginal = null,
mSlipOffOriginal = null,
mSlipOnOriginalHint = null,
mSlipOffOriginalHint = null;
private int mIdBgOn = R.drawable.slide_btn_bg,
mIdBgOff = R.drawable.slide_btn_bg,
mIdBtnOn = R.drawable.record_btn_select_normal_psd_rotate,
mIdBtnOff = R.drawable.switch_camera_select_normal_psd_rotate,
mIdBtnOnHint = R.drawable.record_btn_select_click_psd_rotate,
mIdBtnOffHint = R.drawable.switch_camera_select_click_psd_rotate;
private int mBgOnWidth = 0,
mBgOnHeight = 0,
mSlipOnWidth = 0,
mSlipOnHeight = 0;
private int mOffset = 0;
private float mDegree = 0;
private AttributeSet mAttrs = null;
private ImageView mImageView[] = null;
private Context mContext = null;
private int mScreenWidth = 0,mScreenHeight = 0;
private float mDensity = 0;//屏幕密度
public SlideButton(Context context) {
super(context);
mContext = context;
init(null);
}
public SlideButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
mContext = context;
}
public SlideButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
init(attrs);
mAttrs = attrs;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
init(mAttrs);
}
private void init(AttributeSet attrs){//初始化
//载入图片资源
Options opt = new Options();
opt.inJustDecodeBounds = false;
mBgOnOriginal = BitmapFactory.decodeResource(getResources(), mIdBgOn, opt);
mBgOffOriginal = BitmapFactory.decodeResource(getResources(), mIdBgOff, opt);
mSlipOnOriginal = BitmapFactory.decodeResource(getResources(), mIdBtnOn, opt);
mSlipOffOriginal = BitmapFactory.decodeResource(getResources(), mIdBtnOff, opt);
mSlipOnOriginalHint = BitmapFactory.decodeResource(getResources(), mIdBtnOnHint, opt);
mSlipOffOriginalHint = BitmapFactory.decodeResource(getResources(), mIdBtnOffHint, opt);
// if(attrs != null){
//// mLayout_width = attrs.getAttributeIntValue(NAMESPACE, "layout_width", LayoutParams.WRAP_CONTENT);
//// mLayout_height = attrs.getAttributeIntValue(NAMESPACE, "layout_height", LayoutParams.WRAP_CONTENT);
// mLayout_width = getWidth();
// mLayout_height = getHeight();
//
// if(mLayout_width > 0 && mLayout_height > 0){
// mBgOn = Bitmap.createScaledBitmap(mBgOnOriginal, mLayout_width, mLayout_height, true);
// mBgOff = Bitmap.createScaledBitmap(mBgOffOriginal, mLayout_width, mLayout_height, true);
// mSlipOn = mSlipOnOriginal;
// mSlipOff = mSlipOffOriginal;
// mSlipOnHint = mSlipOnOriginalHint;
// mSlipOffHint = mSlipOffOriginalHint;
//// mSlipOn = Bitmap.createScaledBitmap(mSlipOnOriginal, mLayout_height - 2, mLayout_height - 2, true);
//// mSlipOff = Bitmap.createScaledBitmap(mSlipOffOriginal, mLayout_height - 2, mLayout_height - 2, true);
//// mSlipOnHint = Bitmap.createScaledBitmap(mSlipOnOriginalHint, mLayout_height - 2, mLayout_height - 2, true);
//// mSlipOffHint = Bitmap.createScaledBitmap(mSlipOffOriginalHint, mLayout_height - 2, mLayout_height - 2, true);
// mSlipButton = mSlipOn;
// }else{
// mBgOn = mBgOnOriginal;
// mBgOff = mBgOffOriginal;
// mSlipOn = mSlipOnOriginal;
// mSlipOff = mSlipOffOriginal;
// mSlipOnHint = mSlipOnOriginalHint;
// mSlipOffHint = mSlipOffOriginalHint;
// mSlipButton = mSlipOn;
// }
// }else{
mScreenWidth = TDStaticData.SCREEN_WIDTH;
mScreenHeight = TDStaticData.SCREEN_HEIGHT;
// Log.v("SlideButton", "TDStaticData.SCREEN_WIDTH"+TDStaticData.SCREEN_WIDTH+"TDStaticData.SCREEN_HEIGHT"+TDStaticData.SCREEN_HEIGHT);
if (WiCameraActivity.mCurrentDegree == 90 || WiCameraActivity.mCurrentDegree == 270) {
mScreenHeight = TDStaticData.SCREEN_WIDTH;
}else {
mScreenHeight = TDStaticData.SCREEN_HEIGHT;
}
// Log.e("SlideButton", ""+mDensity);
mDensity = WiCameraActivity.mDensity;
// float scaleY = (float)mScreenHeight/480f * mDensity;
float scaleY = mDensity;
mBgOn = mBgOff = zoomBitmap(mBgOnOriginal,(float)(mBgOnOriginal.getWidth())/scaleY,(float)(mBgOnOriginal.getHeight())/scaleY);
mSlipOn = zoomBitmap(mSlipOnOriginal,(float)(mSlipOnOriginal.getWidth())/scaleY,(float)(mSlipOnOriginal.getHeight())/scaleY);
mSlipOff = zoomBitmap(mSlipOffOriginal,(float)(mSlipOffOriginal.getWidth())/scaleY,(float)(mSlipOffOriginal.getHeight())/scaleY);
mSlipOnHint = zoomBitmap(mSlipOnOriginalHint,(float)(mSlipOnOriginalHint.getWidth())/scaleY,(float)(mSlipOnOriginalHint.getHeight())/scaleY);
mSlipOffHint = zoomBitmap(mSlipOffOriginalHint,(float)(mSlipOffOriginalHint.getWidth())/scaleY,(float)(mSlipOffOriginalHint.getHeight())/scaleY);
// mBgOn = mBgOnOriginal;
// mBgOff = mBgOffOriginal;
// mSlipOn = mSlipOnOriginal;
// mSlipOff = mSlipOffOriginal;
// mSlipOnHint = mSlipOnOriginalHint;
// mSlipOffHint = mSlipOffOriginalHint;
mSlipButton = mSlipOn;
// }
mSlipOnWidth = mSlipOnOriginal.getWidth();
mSlipOnHeight = mSlipOnOriginal.getHeight();
//获得需要的Rect数据
mBtnOn = new Rect(0,0,mSlipButton.getWidth(),mSlipButton.getHeight());
mBtnOff = new Rect(
mBgOff.getWidth() - mSlipButton.getWidth(),
0,
mBgOff.getWidth(),
mSlipButton.getHeight());
this.setPivotX(mBgOn.getWidth()/2);
this.setPivotY(mBgOn.getHeight()/2);
mImageView = new ImageView[2];
mImageView[0] = new ImageView(mContext);
mImageView[1] = new ImageView(mContext);
}
public void setBackground(int resid){
mIdBgOff = mIdBgOn = resid;
// mBgOff = mBgOn = BitmapFactory.decodeResource(getResources(), resid);
mBgOffOriginal = mBgOnOriginal = BitmapFactory.decodeResource(getResources(), resid);
}
public void setOnImage(int resid){
mIdBtnOn = resid;
mSlipOnOriginal = BitmapFactory.decodeResource(getResources(), resid);
init(mAttrs);
}
public void setOffImage(int resid){
mIdBtnOff = resid;
mSlipOffOriginal = BitmapFactory.decodeResource(getResources(), resid);
init(mAttrs);
}
public void setPivot(float pivotX, float pivotY){
this.setPivotX(pivotX);
this.setPivotY(pivotY);
}
@Override
protected void onDraw(Canvas canvas) {//绘图函数
mBtnOn = new Rect(0,0,mSlipButton.getWidth(),mSlipButton.getHeight());
mBtnOff = new Rect(
mBgOff.getWidth() - mSlipButton.getWidth(),
0,
mBgOff.getWidth(),
mSlipButton.getHeight());
super.onDraw(canvas);
Matrix matrix = new Matrix();
Paint paint = new Paint();
float x = 0f;
paint.setAntiAlias(true);
{
//滑动到前半段与后半段的背景不同
if(mNowX < (mBgOn.getWidth()/2)){
canvas.drawBitmap(mBgOff, matrix, paint); //画出关闭时的背景
}
else{
canvas.drawBitmap(mBgOn, matrix, paint); //画出打开时的背景
}
//定位游标位置
if(mOnSlip){//正在滑动
if(mNowX >= mBgOn.getWidth() - mSlipButton.getWidth()/2){//是否划出指定范围
x = mBgOn.getWidth() - mSlipButton.getWidth() + mOffset ;
Log.w("SlipButton_-2", "x = bg.w - sb.w = " + mBgOn.getWidth() + " - " + mSlipButton.getWidth() + " = " + x);
}
else{
x = mNowX - mSlipButton.getWidth()/2 ;
Log.w("SlipButton_-1", "x = now.x - sb.w/2 = " + mNowX + " - " + mSlipButton.getWidth()/2 + " = " + x);
}
}else{//未滑动
if(mNowChoose)//根据现在的开关状态设置画游标的位置
x = mBtnOff.left + mOffset ;
else
x = mBtnOn.left ;
}
//对游标位置进行异常判断...
if(x < 0){
x = 0;
}
else if(x > mBgOn.getWidth() - mSlipButton.getWidth()/2 ){
x = mBgOn.getWidth() - mSlipButton.getWidth() + mOffset ;
Log.w("SlipButton_1", "x = bg.w - sb.w = " + mBgOn.getWidth() + " - " + mSlipButton.getWidth() + " = " + x);
}
//更换游标图片
if(x < mBgOn.getWidth()/2 - mSlipButton.getWidth()/2){
if(mIsPressed){
mSlipButton = mSlipOnHint;
}else{
mSlipButton = mSlipOn;
}
}else{
if(mIsPressed){
mSlipButton = mSlipOffHint;
}else{
mSlipButton = mSlipOff;
}
}
Matrix matrix2 = new Matrix();
matrix2.setRotate(mDegree);
mSlipButton = Bitmap.createBitmap(mSlipButton, 0, 0, mSlipButton.getWidth(), mSlipButton.getHeight(), matrix2, true);
canvas.drawBitmap(mSlipButton, x, 4, paint);//画出游标.
}
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
mIsEnable = enabled;
}
@Override
public boolean onTouchEvent( MotionEvent event) {
boolean state = false;
int [] location = new int[2];
if(!mIsEnable){
return true;
}
getLocationOnScreen(location);
// Log.e("event.getx()="+event.getX(), "mbnon.getwidth()/2="+mBgOn.getWidth()/2+"event.gety()="+event.getY()+"location[0]="+location[0]+"location[1]="+location[1]);
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
mNowX = event.getX();
state = true;
mIsPressed = true;
break;
case MotionEvent.ACTION_DOWN:
if(event.getX() > mBgOn.getWidth() || event.getY() >mBgOn.getHeight()){
return false;
}else {
mOnSlip = true;
mDownX = event.getX();
mNowX = mDownX;
state = true;
}
break;
case MotionEvent.ACTION_UP:
mOnSlip = false;
mIsPressed = false;
boolean LastChoose = mNowChoose;
if(event.getX() >= (mBgOn.getWidth() / 2)){
mNowChoose = true;
}
else{
mNowChoose = false;
}
// Log.e("up", "mIsChangeListenerOn:"+mIsChangeListenerOn+"LastChoose:"+LastChoose+"mNowChoose"+mNowChoose);
if(mIsChangeListenerOn && (LastChoose != mNowChoose)){
mOnChangeListener.OnChecked(mNowChoose);
}
state = true;
break;
default:
break;
}
invalidate();//重画控件
return state;
}
public void setOnChangedListener(OnCheckedChangedListener listener){//设置监听器,当状态修改的时候
mIsChangeListenerOn = true;
mOnChangeListener = listener;
}
public void setBackgroundResid(int resid,int residOn,int residOff, int residOnHit, int residOffHit){
mIdBgOn = resid;
mIdBgOff = resid;
mIdBtnOn = residOn;
mIdBtnOff = residOff;
mIdBtnOnHint = residOnHit;
mIdBtnOffHint = residOffHit;
init(mAttrs);
}
public void setButtonImageResid(int residOff,int residOn,int residoff, int residOnHit, int residOffHit){
mIdBtnOn = residOn;
mIdBgOff = residOff;
mIdBtnOnHint = residOnHit;
mIdBtnOffHint = residOffHit;
init(mAttrs);
}
public void setButtonSize(int width,int height){
mBgOnWidth = width;
mBgOnHeight = height;
mBgOn = zoomBitmap(mBgOnOriginal, width, height);
mBgOff = zoomBitmap(mBgOffOriginal, width, height);
invalidate();
}
public void setSlipSize(int width,int height){
mSlipOnWidth = width;
mSlipOnHeight = height;
mSlipOn = zoomBitmap(mSlipOnOriginal, width, height);
mSlipOff = zoomBitmap(mSlipOffOriginal, width, height);
invalidate();
}
public void setChecked(boolean isChecked){
if(isChecked != mNowChoose){
mNowChoose = isChecked;
invalidate();
}
}
public void setCheckedWithCallback(boolean isChecked){
if(isChecked != mNowChoose){
mNowChoose = isChecked;
invalidate();
mOnChangeListener.OnChecked(mNowChoose); //小心!!!!!!!!!!!!!!!!!!!
}
}
public boolean getChecked(){
return mNowChoose;
}
public int getSlipWidth(){
if(mSlipOn != null && mSlipOff != null){
return mSlipOn.getWidth();
}else {
return -1;
}
}
public int getSlipHeight(){
if(mSlipOn != null && mSlipOff != null){
return mSlipOn.getHeight();
}else {
return -1;
}
}
//放大缩小图片
public Bitmap zoomBitmap(Bitmap bitmap,float w,float h){
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix matrix = new Matrix();
float scaleWidht = ((float)w / width);
float scaleHeight = ((float)h / height);
matrix.postScale(scaleWidht, scaleHeight);
Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix,
true);
return newbmp;
}
/**
* 事件回调接口
* @author WH1107028
*
*/
public interface OnCheckedChangedListener {
abstract void OnChecked(boolean isChecked);
}
@Override
public void setRotation(float rotation) {
// TODO Auto-generated method stub
super.setRotation(rotation);
}
public void setButtonRotation(float rotation){
mDegree = rotation;
invalidate();
}
public static int pxTodip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue * scale + 0.5f);
}
}