package com.wistron.StereoUI;
import android.R.integer;
import android.app.ActionBar.LayoutParams;
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 com.wistron.StereoUI.CSToggleButton.OnChangedListener;
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 float mSlipBtnX = 0;
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,
mBgOnHalf = null,
mBgOffHalf = null,
mSlipButtonHalf = null,
mBgOnOriginal = null,
mBgOffOriginal = null,
mSlipOnOriginal = null,
mSlipOffOriginal = null,
mSlipButtonOriginal = null,
mSlipOnOriginalHint = null,
mSlipOffOriginalHint = null;
private int mIdBgOn = R.drawable.btn_3d2d_background,
mIdBgOff = R.drawable.btn_3d2d_background,
mIdBtnOn = R.drawable.btn_3d2d_2d_normal,
mIdBtnOff = R.drawable.btn_3d2d_3d_normal,
mIdBtnOnHint = R.drawable.btn_3d2d_2d_pressed,
mIdBtnOffHint = R.drawable.btn_3d2d_3d_pressed;
private int mBgOnWidth = 0,
mBgOnHeight = 0,
mSlipOnWidth = 0,
mSlipOnHeight = 0;
private int mLayout_width = 0,
mLayout_height = 0;
private AttributeSet mAttrs = null;
private boolean mHasMeasured = false;
public SlideButton(Context context) {
super(context);
init(null);
}
public SlideButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlideButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs);
mAttrs = attrs;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(!mHasMeasured){
init(mAttrs);
mHasMeasured = true;
}
}
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){ //设定最佳默认值
mLayout_width = 133;
mLayout_height = 78;
}
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{
mBgOn = mBgOnOriginal;
mBgOff = mBgOffOriginal;
mSlipOn = mSlipOnOriginal;
mSlipOff = mSlipOffOriginal;
mSlipOnHint = mSlipOnOriginalHint;
mSlipOffHint = mSlipOffOriginalHint;
mSlipButton = mSlipOn;
}
//获得需要的Rect数据
mBtnOn = new Rect(0,0,mSlipButton.getWidth(),mSlipButton.getHeight());
mBtnOff = new Rect(
mBgOff.getWidth() - mSlipButton.getWidth(),
0,
mBgOff.getWidth(),
mSlipButton.getHeight());
this.setPivotX(mBtnOn.width()/2);
this.setPivotY(mBtnOn.height()/2);
mSlipOnWidth = mSlipOnOriginal.getWidth();
mSlipOnHeight = mSlipOnOriginal.getHeight();
}
public void setScaleThumbX(float scale, float degree){
}
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);
}
/* ToggleButton.onDraw()
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
final Drawable buttonDrawable = mButtonDrawable;
if (buttonDrawable != null) {
final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
final int height = buttonDrawable.getIntrinsicHeight();
int y = 0;
switch (verticalGravity) {
case Gravity.BOTTOM:
y = getHeight() - height;
break;
case Gravity.CENTER_VERTICAL:
y = (getHeight() - height) / 2;
break;
}
buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height);
buttonDrawable.draw(canvas);
}
}
*/
@Override
protected void onDraw(Canvas canvas) {//绘图函数
Log.e("TEST", "onDraw----------------------------------------");
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();
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;
else
x = mBtnOn.left;
}
//对游标位置进行异常判断...
if(x < 0){
x = 0;
}
else if(x > mBgOn.getWidth() - mSlipButton.getWidth()){
x = mBgOn.getWidth() - mSlipButton.getWidth();
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;
}
}
canvas.drawBitmap(mSlipButton, x, 0, 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){
mIdBgOn = resid;
mIdBgOff = resid;
init(mAttrs);
}
public void setButtonImageResid(int residOn, int residOnHit, int residOff, 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 setHalfScale(){
//保存压缩后的图片
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 1f);
mSlipButtonHalf = Bitmap.createBitmap(mSlipButton, 0, 0, mSlipButton.getWidth(), mSlipButton.getHeight(), matrix, true);
}
public void setSlipScaleAndRotation(float sx,float sy,float rotation){
invalidate();
}
public void setButtonScale(float sx,float sy){
Matrix matrix = new Matrix();
matrix.setScale(sx, sy);
mBgOn = Bitmap.createBitmap(mBgOn, 0, 0, mBgOn.getWidth(), mBgOn.getHeight(), matrix, true);
mBgOff = Bitmap.createBitmap(mBgOff, 0, 0, mBgOff.getWidth(), mBgOff.getHeight(), matrix, true);
invalidate();
}
public void setChecked(boolean isChecked){
if(isChecked != mNowChoose){
mNowChoose = isChecked;
invalidate();
}
}
public void setCheckedWithCallback(boolean isChecked){
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,int w,int 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);
}
}