Android总结(五)

焦点事件

1.焦点事件是指针对于一个组件的状态的监听。在一个界面中,当要操作某一个组件时,就表示该组件获得了焦点。如:当需要输入文本时,可定要选中文本框,此时文本框就获得了焦点。使用方法:
public void setOnFocusChangeListener(View.OnFocusChangeListener).
2.

public class MyFocusDemo extends Activity {
    private EditText edit = null; // 在此组件上设置焦点事件
    private TextView txt = null; // 用于信息提示

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        this.edit = (EditText) super.findViewById(R.id.edit); // 取得组件
        this.txt = (TextView) super.findViewById(R.id.txt); // 取得组件
        this.edit.setOnClickListener(new OnClickListenerImpl()); // 设置单击事件
        this.edit.setOnFocusChangeListener(new OnFocusChangeListenerImpl());//焦点事件
    }

    private class OnClickListenerImpl implements OnClickListener {

        public void onClick(View v) {
            MyFocusDemo.this.edit.setText(""); // 清空文本
        }

    }

    private class OnFocusChangeListenerImpl implements OnFocusChangeListener {

        public void onFocusChange(View v, boolean hasFocus) { // 表示操作的组件,而hasFocus表示是否获得焦点
            if (hasFocus) { // 已经获得了焦点
                MyFocusDemo.this.txt.setText("文本输入组件获得焦点。");
            } else {
                if (MyFocusDemo.this.edit.getText().length() > 0) { // 现在有数据
                    MyFocusDemo.this.txt.setText("文本输入组件失去焦点,输入内容合法。");
                } else {
                    MyFocusDemo.this.txt.setText("文本输入组件失去焦点,输入内容不能为空。");
                }
            }
        }

    }
}

常按事件

1.常按事件就比如按某一个组件2秒之后才会触发这一操作,而不像普通的单击事件那样,每次单击都会执行一次。使用接口的定义:
public satic interface View.OnLongClickListener{
public boolean onLongClick(View v); }
处理用setOnLongClickListener()方法绑定的事件,之后使用onLongClick()方法执行具体的事件处理操作。
2.实例:程序首先使用ImageView显示一张图片,当用户长按时,将图片设置为手机的桌面背景。取得一个图片的InputStream对象要使用以下方法:
Resource对象.openRawResource(资源ID).

(1)添加允许设置桌面背景的权限
<uses-permission android:name="android.permission.SET_WALLPAPER"/>

(2)主程序:
public class MyLongClickDemo extends Activity {
    private TextView info = null;
    private ImageView img = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        this.img = (ImageView) super.findViewById(R.id.img);
        this.info = (TextView) super.findViewById(R.id.info);
        this.img.setOnLongClickListener(new OnLongClickListenerImpl());
    }

    private class OnLongClickListenerImpl implements OnLongClickListener {

        public boolean onLongClick(View v) {
            try {
                MyLongClickDemo.this.clearWallpaper(); // 清除已有的桌面
                MyLongClickDemo.this.setWallpaper(MyLongClickDemo.this.img
                        .getResources().openRawResource(R.drawable.mldn_bg)); // 设置桌面
                MyLongClickDemo.this.info.setText("手机桌面背景已修改。");
            } catch (Exception e) {
                e.printStackTrace() ;
                MyLongClickDemo.this.info.setText("手机桌面背景设置失败。");
            }
            return false;
        }
    }
}

键盘事件

1.键盘事件使用View.OnKeyListener接口进行事件的处理。此接口定义:
public static interface View.OnClickListener{
public boolean onKey(View v,int keyCode,KeyEvent event); }
该接口用于处理setOnKeyListener()方法绑定的时间,触发后将自动使用onKey()方法进行事件的处理,返回boolean值,一般返回false。(View表示操作此事件的组件;;keyCode对应着按键的编码数字;;KeyEvent表示触发的对象事件)。
2.实例:使用正则表达式验证输入的是否是email地址。

public class MyKeyDemo extends Activity {
    private EditText input = null;
    private ImageView img = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        this.input = (EditText) super.findViewById(R.id.input); // 取得组件
        this.img = (ImageView) super.findViewById(R.id.img); // 取得组件
        this.input.setOnKeyListener(new OnKeyListenerImpl());
    }

    private class OnKeyListenerImpl implements OnKeyListener {

        public boolean onKey(View v, int keyCode, KeyEvent event) {
            switch (event.getAction()) {
            case KeyEvent.ACTION_UP:
                String msg = MyKeyDemo.this.input.getText().toString(); // 取得输入的文字信息
                if (msg.matches("\\w+@\\w+\\.\\w+")) { // 验证通过
                    MyKeyDemo.this.img.setImageResource(R.drawable.right); // 设置正确图片
                } else {
                    MyKeyDemo.this.img.setImageResource(R.drawable.wrong); // 设置错误图片
                }
            case KeyEvent.ACTION_DOWN: // 键盘按下
                break;
            }
            return false;
        }
    }
}

触摸事件

1.触摸事件(OnTouchListener)指的是当用户接触到屏幕之后所产生的一种事件形式,而当用户在屏幕上划过时,可以使用触摸事件取得用户当前的坐标。接口定义:
public interface View.OnTouchListener{
public anstract boolean onTouch(View v,MotionEvent event); }
当用户触摸屏幕之后自动执行onTouch()方法进行处理,同时自动产生一个MotionEvent事件类的对象,通过此对象可以取得用户当前的X坐标和Y坐标。
2.

public class MyPaintView extends View {
    private List<Point> allPoint = new ArrayList<Point>(); // 保存所有的操作坐标

    public MyPaintView(Context context, AttributeSet attrs) { // 接收Context,同时接收属性集合
        super(context, attrs); // 调用父类的构造
        super.setOnTouchListener(new OnTouchListenerImpl());
    }

    private class OnTouchListenerImpl implements OnTouchListener {
        public boolean onTouch(View v, MotionEvent event) {
            Point p = new Point((int) event.getX(), (int) event.getY()); // 将坐标保存在Point类
            if (event.getAction() == MotionEvent.ACTION_DOWN) { // 按下,表示重新开始保存点
                MyPaintView.this.allPoint = new ArrayList<Point>(); // 重绘
                MyPaintView.this.allPoint.add(p); // 保存点
            } else if (event.getAction() == MotionEvent.ACTION_UP) { // 用户松开
                MyPaintView.this.allPoint.add(p); // 记录坐标点
                MyPaintView.this.postInvalidate(); // 重绘图形
            } else if (event.getAction() == MotionEvent.ACTION_MOVE) { // 用户移动
                MyPaintView.this.allPoint.add(p); // 记录坐标点
                MyPaintView.this.postInvalidate(); // 重绘图形
            }
            return true; // 表示下面的操作不再执行了。
        }
    }

    @Override
    protected void onDraw(Canvas canvas) { // 进行绘图
        Paint p = new Paint(); // 依靠此类开始画线
        p.setColor(Color.RED);// 定义图的颜色
        if (MyPaintView.this.allPoint.size() > 1) { // 现在有坐标点保存的时候可以开始进行绘图
            Iterator<Point> iter = MyPaintView.this.allPoint.iterator();
            Point first = null;
            Point last = null;
            while (iter.hasNext()) {
                if (first == null) {
                    first = (Point) iter.next(); // 取出坐标
                } else {
                    if (last != null) { // 前一阶段已经完成了
                        first = last; // 重新开始下一阶段
                    }
                    last = (Point) iter.next(); // 结束点坐标
                    canvas.drawLine(first.x, first.y, last.x, last.y, p);
                }
            }
        }
    }

}

你可能感兴趣的:(android,界面)