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

    xiaoxiao2024-12-27  15

    安卓中,最常见的回调接口就是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.activity_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的点击事件的简单实现。
    转载请注明原文地址: https://ju.6miu.com/read-1295050.html
    最新回复(0)