本文主要讲述两个知识点:popwindow的使用和通过继承View实现一个自定义控件,实现点击,手动按钮的效果.
popwindow的使用
popWin = new PopupWindow(MainActivity.this);
popWin.setWidth(input.getWidth());
popWin.setHeight(200);
popWin.setContentView(listView);
popWin.setOutsideTouchable(true);
popWin.showAsDropDown(input, 0, 0);
自定义控件实现开关拖动按钮
第一步:实现自定义控件要继承view
public class MyToggleButton extends View implements OnClickListener{
第二步:写构造函数并初始化
/**
* 在代码里面创建对象的时候,使用此构造方法
*/
public MyToggleButton(Context context) {
super(context);
}
/**
* 在布局文件中声名的view,创建时由系统自动调用。
* @param context 上下文对象
* @param attrs 属性集
*/
public MyToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
/**
* 初始化
*/
private void initView() {
backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
slideBtn = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);
paint = new Paint();
paint.setAntiAlias(true);
setOnClickListener(this);
}
第三步:重写方法
@Override
/**
* 测量尺寸时的回调方法
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* 设置当前view的大小
* width :view的宽度
* height :view的高度 (单位:像素)
*/
setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());
}
/**
* 当前开关的状态
* true 为开
*/
private boolean currState = false;
@Override
/**
* 绘制当前view的内容
*/
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(backgroundBitmap, 0, 0, paint);
canvas.drawBitmap(slideBtn, slideBtn_left, 0, paint);
}
第四步:监听点击与拖动事件
/**
* 判断是否发生拖动,
* 如果拖动了,就不再响应 onclick 事件
*
*/
private boolean isDrag = false;
@Override
/**
* onclick 事件在View.onTouchEvent 中被解析。
* 系统对onclick 事件的解析,过于简陋,只要有down 事件 up 事件,系统即认为 发生了click 事件
*
*/
public void onClick(View v) {
if(!isDrag){
currState = !currState;
flushState();
}
}
/**
* down 事件时的x值
*/
private int firstX;
/**
* touch 事件的上一个x值
*/
private int lastX;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
firstX = lastX =(int) event.getX();
isDrag = false;
break;
case MotionEvent.ACTION_MOVE:
if(Math.abs(event.getX()-firstX)>5){
isDrag = true;
}
int dis = (int) (event.getX() - lastX);
lastX = (int) event.getX();
slideBtn_left = slideBtn_left+dis;
break;
case MotionEvent.ACTION_UP:
if (isDrag) {
int maxLeft = backgroundBitmap.getWidth() - slideBtn.getWidth();
if (slideBtn_left > maxLeft / 2) {
currState = true;
} else {
currState = false;
}
flushState();
}
break;
}
flushView();
return true;
}
第五步:刷新当前状态
/**
* 刷新当前状态
*/
private void flushState() {
if(currState){
slideBtn_left = backgroundBitmap.getWidth()-slideBtn.getWidth();
}else{
slideBtn_left = 0;
}
flushView();
}
/**
* 刷新当前视力
*/
private void flushView() {
int maxLeft = backgroundBitmap.getWidth()-slideBtn.getWidth();
slideBtn_left = (slideBtn_left>0)?slideBtn_left:0;
slideBtn_left = (slideBtn_left<maxLeft)?slideBtn_left:maxLeft;
invalidate();
}
第六步:在layout中添加全类名使用
<com.zj.switchbutton.MyTrouggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
运行效果