您的位置:首页 > 移动开发 > Android开发

Android 自定义开关控件

2015-07-01 20:03 525 查看
效果图:





使用的图片素材







相关代码如下:

自定义类:WiperSwitch.java

package com.android.systemui.keyguard;

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.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class WiperSwitch extends View implements OnTouchListener {
private Bitmap bg_on, bg_off, slipper_btn;
private float downX, nowX;

private boolean onSlip = false;

private boolean nowStatus = false;

private OnChangedListener listener;

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

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

public void init() {
bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.on_btn);
bg_off = BitmapFactory.decodeResource(getResources(),
R.drawable.off_btn);
slipper_btn = BitmapFactory.decodeResource(getResources(),
R.drawable.white_btn);
setOnTouchListener(this);
}

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Matrix matrix = new Matrix();
Paint paint = new Paint();
float x = 0;
if (nowX < (bg_on.getWidth() / 2)) {
canvas.drawBitmap(bg_off, matrix, paint);
} else {
canvas.drawBitmap(bg_on, matrix, paint);
}

if (onSlip) {
if (nowX >= bg_on.getWidth())
x = bg_on.getWidth() - slipper_btn.getWidth() / 2;
else
x = nowX - slipper_btn.getWidth() / 2;
} else {
if (nowStatus) {
x = bg_on.getWidth() - slipper_btn.getWidth();
} else {
x = 0;
}
}

if (x < 0) {
x = 0;
} else if (x > bg_on.getWidth() - slipper_btn.getWidth()) {
x = bg_on.getWidth() - slipper_btn.getWidth();
}

canvas.drawBitmap(slipper_btn, x, 0, paint);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
if (event.getX() > bg_off.getWidth()
|| event.getY() > bg_off.getHeight()) {
return false;
} else {
onSlip = true;
downX = event.getX();
nowX = downX;
}
break;
}
case MotionEvent.ACTION_MOVE: {
nowX = event.getX();
break;
}
case MotionEvent.ACTION_UP: {
onSlip = false;
if (event.getX() >= (bg_on.getWidth() / 2)) {
nowStatus = true;
nowX = bg_on.getWidth() - slipper_btn.getWidth();
} else {
nowStatus = false;
nowX = 0;
}

if (listener != null) {
listener.OnChanged(WiperSwitch.this, nowStatus);
}
break;
}
}
invalidate();
return true;
}

public void setOnChangedListener(OnChangedListener listener) {
this.listener = listener;
}

public void setChecked(boolean checked) {
if (checked) {
nowX = bg_off.getWidth();
} else {
nowX = 0;
}
nowStatus = checked;
}

public interface OnChangedListener {
public void OnChanged(WiperSwitch wiperSwitch, boolean checkState);
}

}


2.调用该类
package com.android.systemui.keyguard;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

import com.android.systemui.keyguard.WiperSwitch.OnChangedListener;
public class MainActivity extends Activity  {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WiperSwitch wiperSwitch = (WiperSwitch)findViewById(R.id.keyguard_setting_app_switch);
wiperSwitch.setChecked(true);
wiperSwitch.setOnChangedListener(new OnChangedListener() {

@Override
public void OnChanged(WiperSwitch wiperSwitch, boolean checkState) {
// TODO Auto-generated method stub

if (checkState) {
Toast.makeText(MainActivity.this, "开启",1).show();

}else {
Toast.makeText(MainActivity.this, "关闭",1).show();
}
}
});
}

}


布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp" >

<com.android.systemui.keyguard.WiperSwitch
android:id="@+id/keyguard_setting_app_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>

</RelativeLayout>


源码下载:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: