一.物理按键
重写public boolean onKeyDown(int keyCode, KeyEvent event) 方法
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;
public class MainActivity extends Activity {
private long exitTime = 0; //退出时间变量值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit();
return true; //拦截返回键
}
return super.onKeyDown(keyCode, event);
}
public void exit() {
if ((System.currentTimeMillis() - exitTime) > 2000) { //计算按键时间差是否大于两秒
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0); //销毁强制退出
}
}
}
二.长按事件
使用setOnLongClickListener(new View.OnLongClickListener() 方法
import android.app.Activity;
import android.media.Image;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = (ImageView) findViewById(R.id.imageView); //获取图片组件
imageView.setOnLongClickListener(new View.OnLongClickListener() { //创建长按监听事件
@Override
public boolean onLongClick(View v) {
registerForContextMenu(v); //将长按事件注册菜单中
openContextMenu(v); //打开菜单
return false;
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { //创建菜单
super.onCreateContextMenu(menu, v, menuInfo);
menu.add("收藏"); //为菜单添加参数
menu.add("举报");
}
}
3.触摸事件
.setOnTouchListener(new View.OnTouchListener()
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout); // 获取相对局管理器
final HatView hat = new HatView(MainActivity.this); // 创建并实例化HatView类
// 为帽子添加触摸事件监听
hat.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
hat.bitmapX = event.getX()-80; // 设置帽子显示位置的X坐标
hat.bitmapY = event.getY()-50; // 设置帽子显示位置的Y坐标
hat.invalidate(); // 重绘hat组件
return true;
}
});
relativeLayout.addView(hat); //将hat添加到布局管理器中
}
}
四.手势检测
1.让Mainactivity实现GestureDetector.OnGuestListener接口,并实现其所有方法
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener{}
2.定义一个全局的手势检测器
GestureDetector detector;
3.将显示的图片加载到ViewFlipper中,并且初始化动画数组
ImageView imageView = new ImageView(this);
imageView.setImageResource(images[i]);
flipper.addView(imageView);
animation[0] = AnimationUtils.loadAnimation(this, R.anim.slide_in_left);
4.在需要的手势中设置动画
flipper.setInAnimation(animation[2]);
import android.gesture.Gesture;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ViewFlipper;
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {
ViewFlipper flipper; //定义ViewFlipper
GestureDetector detector; //定义手势检测器
Animation[] animation = new Animation[4];//定义动画数组,为ViewFlipper指定切换动画
final int distance = 50; //定义手势动作两点之间最小距离
//定义图片数组
private int[] images = new int[]{R.drawable.img01, R.drawable.img02, R.drawable.img03,
R.drawable.img04, R.drawable.img05, R.drawable.img06, R.drawable.img07, R.drawable.img08,
R.drawable.img09,
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
detector = new GestureDetector(this, this); //创建手势检测器
flipper = (ViewFlipper) findViewById(R.id.flipper); //获取ViewFlipper
for (int i = 0; i < images.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(images[i]);
flipper.addView(imageView); //加载图片
}
//初始化动画数组
animation[0] = AnimationUtils.loadAnimation(this, R.anim.slide_in_left);
animation[1] = AnimationUtils.loadAnimation(this, R.anim.slide_out_left);
animation[2] = AnimationUtils.loadAnimation(this, R.anim.slide_in_right);
animation[3] = AnimationUtils.loadAnimation(this, R.anim.slide_out_right);
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
/*
如果第一个触点事件的X坐标到第二个触点事件的X坐标的距离超过distance就是从右向左滑动
*/
if (e1.getX() - e2.getX() > distance) {
//为flipper设置切换的动画效果
flipper.setInAnimation(animation[2]);
flipper.setOutAnimation(animation[1]);
flipper.showPrevious();
return true;
/*
如果第二个触点事件的X坐标到第一个触点事件的X坐标的距离超过distance就是从左向右滑动
*/
} else if (e2.getX() - e1.getX() > distance) {
//为flipper设置切换的动画
flipper.setInAnimation(animation[0]);
flipper.setOutAnimation(animation[3]);
flipper.showNext();
return true;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//将该Activity上的触碰事件交给GestureDetector处理
return detector.onTouchEvent(event);
}
}