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

Android中使用回调接口实现自定义view的点击事件

2016-08-13 18:51 786 查看
安卓中,最常见的回调接口就是view的点击监听事件方法,当然,回调接口不止再此使用,他还有更广泛的使用场景。
今天,我就通过一个简单的实现点击事件Demo,了解一下回调接口的简单应用。
首先自定义一个简单的View,类名为TestButton,继承于Button类(这里的父类可以在View的子类中任意选择继承,为了演示方便,我选择Button),在TestButton中,只需要重写OnTouchEvent()这个方法。
TestButton具体内容如下:


public class TestButton extends Button {

private int startX;
private int startY;
private int offsetX;
private int offsetY;

public TestButton(Context context) {
this(context, null);
}

public TestButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public TestButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getX();
int moveY = (int) event.getY();
offsetX = moveX - startX;
offsetY = moveY - startY;
break;
case MotionEvent.ACTION_UP:
if (Math.abs(offsetX) <= 5 && Math.abs(offsetY) <= 5) {
System.out.println("点击有效");
if (mMyOnClickListener != null) {
//这里需要进行一些操作
}
}
offsetX = 0;
offsetY = 0;
break;
}
return true;
}
}


OnTouchEvent()方法是用户与设备之间手势交互的一个最重要的方法,Android中点击,长按,滑动等这些事件,都是在这个方法里实现的。在OnTouchEvent()中我对用户手势进行简单的判断,当用户点击按钮水平和竖直位移同时小于5时,表示用户正确点击了按钮。当用户正确点击了按钮后,系统必须进行一个回应,比如打开一个界面,或者弹出一个吐司等等。此时,如果在这里写一个跳转页面的操作后,那这个自定义控件的点击事件就被写死了。那么,我们可不可以在这里先声明一个有方法名称,而没有方法体的方法,具体方法实现交给后面的开发中实现呢?当然可以,具有方法名称,没有方法体这不是正是接口的特点么。
所以,我在TestButton类中,定义一个内部接口interface MyOnClickListener,接口内包含一个抽象方法OnClick(),


public interface MyOnClickListener {
void OnClick();
}


然后在TestButton中声明了一个没有实例化的接口对象:


MyOnClickListener mMyOnClickListener = null;


现在接口对象有了,我们就可以在OnTouchEvent()方法中调用接口对象的onCliCk()方法。代码如下:


case MotionEvent.ACTION_UP:
if (Math.abs(offsetX) <= 5 && Math.abs(offsetY) <= 5) {
System.out.println("点击有效");
if (mMyOnClickListener != null) {
//这里需要进行一些操作
if (mMyOnClickListener != null) {
mMyOnClickListener.OnClick();
}
}
}
offsetX = 0;
offsetY = 0;
break;
}


当然,此时调用mMyOnClickListener.OnClick()会编译出错,因为mMyOnClickListener对象并没有实例化。在前面我们已经知道OnClick()的具体实现不应该在当前类中实现,所以mMyOnClickListener接口对象我们同样不可以在当前类中实例化,因为实例化一个接口,只能用一个类实现该接口,并且重写接口中的抽象方法。所以我们需要一个外部类可以访问,并且可以为mMyOnClickListener对象赋值的一个共有方法,该方法如下:


public void setMyOnClickListener(MyOnClickListener l) {
mMyOnClickListener = l;
}


然后我们就可以在MainActivity中调用setMyOnClickListener(MyOnClickListener l)如下:


public class MainActivity extends Activity {
private TestButton mTestButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activ
8f1c
ity_main);
mTestButton = (TestButton) findViewById(R.id.testbutton);
mTestButton.setMyOnClickListener(new MyOnClickListener() {
@Override
public void OnClick() {
Toast.makeText(getApplicationContext(), "点击有效",
Toast.LENGTH_SHORT).show();
}
});
}
}


xml文件代码局部如下:


<com.example.androidtest.TestButton
android:id="@+id/testbutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#a000"
android:text="点我"
android:textColor="#fff" />


当我们调用TestButton对象的setMyOnClickListener(MyOnClickListener l)方法时,需要传递一个接口对象,这里我使用了一个匿名内部类,在这个匿名内部类中,我重写了onClick()方法,我在方法中弹出一个吐司,显示“点击有效”。
此时,我们就已经通过setMyOnClickListener的参数传递,使得TestButton中之前没有被实例化的接口对象mMyOnClickListener被实例化,并且指向我在MainActivity中写的那个匿名内部类,当然mMyOnClickListener中那个没有方法体的onClick(),也指向我重写的onClick()方法。
到此为止,我们代码处理就已经完成,接下来将代码运行到模拟器上,当你点击屏幕中的按钮时,爱屏幕的下方,就会弹出一个显示“点击有效”的吐司,表示你点击成功。
以上,就是一个view的点击事件的简单实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android