zoukankan      html  css  js  c++  java
  • Android onTouchListener的用法

      OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。该接口中的监听方法签名如下。

    Java代码:
    public boolean onTouch(View v, MotionEvent event)


           参数v:参数v同样为事件源对象。
           参数event:参数event为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息。

           节中介绍了一个在屏幕中拖动矩形移动的案例,本节将继续采用该案例的思路,通过监听接口的方式实现在屏幕上拖动按钮移动的案例。开发步骤如下。

           创建一个名为Sample的Android项目。

           准备字符串资源,打开strings.xml文件,用下列代码替换原有代码。

    Java代码:
    <?xml version="1.0" encoding="utf-8"?>
    <!-- XML的版本及编码方式 -->
    <resources>
    <string name="hello">Hello World, Sample</string>
    <!--定义hello字符串 -->
    <string name="app_name">Sample</string>
    <!--定义app_name字符串-->
    <string name="location">位置</string>
    <!--定义location字符串-->
    </resources>


           说明:与前面介绍的案例相同,对程序中用到的字符串资源进行定义。
           开发布局文件。打开res/layout目录下的main.xml,用下列代码替换其原有代码。

    Java代码:
    <?xml version="1.0" encoding="utf-8"?>
    <!-- XML的版本及编码方式 -->
    <AbsoluteLayout
    android:id="@+id/AbsoluteLayout01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- XML的版本及编码方式 -->
    <Button
    android:layout_y="123dip"
    android:layout_x="106dip"
    android:text="@string/location"
    android:layout_height="wrap_content"
    android:id="@+id/Button01"
    android:layout_width="wrap_content"/>
    <!-- XML的版本及编码方式 -->
    </AbsoluteLayout>


           说明:该布局文件非常简单,只是在一个绝对布局中添加一个按钮控件即可,需要注意的是应该为该按钮指定ID,以便在Java代码中可以得到该按钮的引用。

           接下来开始开发主要的逻辑代码。编写Sample.java文件,其代码如下所示。

    Java代码:
    package wyf.ytl;
    //声明所在包
    import android.app.Activity;
    //引入相关类
    //该处省略了部分类的引入代码,读者可以自行查阅随书光盘中的源代码
    import android.widget.Button;
    //引入相关类
    public class Sample extends Activity {
    final static int WRAP_CONTENT=-2;
    //表示WRAP_CONTENT的常量
    final static int X_MODIFY=4;
    //在非全屏模式下X坐标的修正值
    final static int Y_MODIFY=52;
    //在非全屏模式下Y坐标的修正值
    int xSpan;
    //在触控笔点击按钮的情况下相对于按钮自己坐标系的
    int ySpan;
    //X,Y位置
    public void onCreate(Bundle savedInstanceState) {
    //重写的onCreate方法
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //设置当前的用户界面
    Button bok=(Button)this.findViewById(R.id.Button01);
    //得到按钮的引用
    bok.setOnTouchListener(
    //添加监听
    new OnTouchListener(){
    //创建监听类
    public boolean onTouch(View view, MotionEventevent) {
    //重写的监听方法
    switch(event.getAction()){
    //监听事件
    case MotionEvent.ACTION_DOWN:
    //触控笔按下
    xSpan=(int)event.getX();
    //得到X坐标
    ySpan=(int)event.getY();
    //得到Y坐标
    break;
    case MotionEvent.ACTION_MOVE:
    //触控笔移动
    Button bok=(Button)findViewById(R.id.Button01);
    //让按钮随着触控笔的移动一起移动
    ViewGroup.LayoutParams lp= new AbsoluteLayout.LayoutParams( WRAP_CONTENT,
    WRAP_CONTENT,(int)event.getRawX()-xSpan-X_MODIFY,(int)event.getRawY()-ySpan-Y_MODIFY ) ;
    bok.setLayoutParams(lp);
    //设置按钮的坐标
    break;
    }
    return true;
    }
    }
    );
    }

    public boolean onKeyDown (int keyCode, KeyEvent event){
    //键盘键按下的方法
    Button bok=(Button)this.findViewById(R.id.Button01);
    //得到按钮的引用
    bok.setText(keyCode+" Down");
    //设置按钮的文字
    return true;
    }
    public boolean onKeyUp (int keyCode,KeyEvent event){
    //键盘键抬起的方法
    Button bok=(Button)this.findViewById(R.id.Button01);
    //得到按钮的引用
    bok.setText(keyCode+" Up");
    //设置按钮的文字
    return true;
    }
    public boolean onTouchEvent (MotionEventevent){
    //让按钮随触控笔的移动一起移动
    Button bok=(Button)this.findViewById(R.id.Button01);
    //得到按钮引用
    ViewGroup.LayoutParams lp=
    new AbsoluteLayout.LayoutParams(
    //创建
    LayoutParams WRAP_CONTENT, WRAP_CONTENT, (int)event.getRawX()-xSpan-X_MODIFY,
    //X坐标
    (int)event.getRawY()-ySpan-Y_MODIFY
    //Y坐标
    ) ;
    bok.setLayoutParams(lp);
    return true;
    }

    }


           第6~10行声明了程序中需要的一些变量。
           第11~40行重写了Activity中的onCreate方法,在方法中设置当前的用户界面,然后得到按钮的引用并为其注册监听。第16~38行创建监听器类并重写onTouch方法,然后根据事件的类型执行不同的操作。
           第41~45行重写了onKeyDown回调方法,在该方法中得到按钮的引用并设置按钮上的文字,第46~50行重写了onKeyUp回调方法,同样也是设置按钮上的文字。
           第51~61行重写了onTouchEvent回调方法,用来处理屏幕事件的监听方法,在方法中得到按钮的引用,然后设置按钮的坐标。

           运行该案例,通过触控笔便可拖动屏幕中的按钮移动,如图所示。

    欧克蓝科技
  • 相关阅读:
    BTree和B+Tree详解
    python小技巧01递归解释内嵌
    Python实战171201筛选数据
    学术网站
    现代科技新闻
    人工智能——深度学习介绍
    时区缩写
    centos7忘记root密码
    centos7正确关机重启
    虚拟化漫谈
  • 原文地址:https://www.cnblogs.com/sias/p/3773235.html
Copyright © 2011-2022 走看看