用于项目中可能要用到此功能,于是就看了下相关代码,发现网上很多人的实现方式都是fragment和FrameLayout,但是看了后感觉都太麻烦了,于是我自己试着写了下,具体实现方式是一个页面两个VIew,一个作为菜单开始隐藏起来,一个作为展示页面,监听用户手势,在显示之前播放一个平移动画,隐藏也是如此,其他操作就和一个页面一样了,没什么区别能够很轻松的监听用户各种操作,出来打开和隐藏的时候稍有逊色之外其他的都要流畅一点。当然这是作为一个懒人的做法,哈哈。

动画代码:

TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);
布局就是两个layout 水平并列,考虑适配机型 设置weight的值即可。就不上代码了

界面对应activity完整代码

public class TestActivity extends Activity
implements BookListFragment.Callbacks,OnTouchListener,OnGestureListener {
GestureDetector detector;

public TestActivity() {
detector = new GestureDetector(this);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载/res/layout目录下的activity_book_twopane.xml
setContentView(R.layout.activity_book_twopane);
LinearLayout tv = (LinearLayout) findViewById(R.id.linearLayout);
//设置tv的监听器
tv.setOnTouchListener(this);
tv.setFocusable(true);
//必须,view才能够处理不同于Tap(轻触)的hold
tv.setClickable(true);
tv.setLongClickable(true);
detector.setIsLongpressEnabled(true);
detector.setIsLongpressEnabled(true);
findViewById(R.id.book_list).setVisibility(View.GONE);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_test_fragment, menu);
return true;
}

//实现Callbacks接口必须实现的方法
@Override
public void onItemSeleted(int id) {
//创建Bundle对象,准备向Fragment传入参数
Bundle arguments = new Bundle();
arguments.putInt(BookDetailFragement.ITEM_ID, id);
//创建BookDetailFragment对象
BookDetailFragement fragment = new BookDetailFragement();
//向Fragment中传入参数
fragment.setArguments(arguments);
//使用fragment替换book_detail_container容器当前显示的Fragment
getFragmentManager().beginTransaction()
.replace(R.id.book_detail_container, fragment).commit();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent e) {
// Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();
return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {

// 参数解释:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒

// 触发条件 :
// X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒

final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling left
// Toast.makeText(this, "Fling Left", Toast.LENGTH_SHORT).show();
TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);

// findViewById(R.id.book_list).setVisibility(View.GONE);
} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling right
// Toast.makeText(this, "Fling Right", Toast.LENGTH_SHORT).show();
findViewById(R.id.book_list).setVisibility(View.VISIBLE);

TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);
} else if(e2.getY()-e1.getY()>FLING_MIN_DISTANCE && Math.abs(velocityY)>FLING_MIN_VELOCITY) {
// Fling down
// Toast.makeText(this, "Fling down", Toast.LENGTH_SHORT).show();
} else if(e1.getY()-e2.getY()>FLING_MIN_DISTANCE && Math.abs(velocityY)>FLING_MIN_VELOCITY) {
// Fling up
// Toast.makeText(this, "Fling up", Toast.LENGTH_SHORT).show();
}


return false;

}

@Override
public void onLongPress(MotionEvent e) {
// Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show();
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();
return true;
}

@Override
public void onShowPress(MotionEvent e) {
// Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onSingleTapUp(MotionEvent e) {
// Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();
return true;
}
}

更多相关文章

  1. 小谈android/Linux rootkit(基于LKM)
  2. Android(安卓)上层界面到内核代码的完整的流程分析,以alarm为例子
  3. Android使用Gradle命令动态传参完成打包,不需要修改代码
  4. 新版本Android(安卓)Studio 3.5以上版本新特性(Apply Changes and
  5. android 布局适应不同分辨率
  6. Android(安卓)显示GIF图片实例详解
  7. Android中用JNI实现与原生代码通信
  8. Android(安卓)应用防止被二次打包指南
  9. Android中显示GIF动画的实现代码

随机推荐

  1. Android 子线程请求ASP.NET后台
  2. Android(安卓)组件Activity,Application
  3. Android设置渐变色状态栏
  4. 2013年Android 学习计划
  5. Android实现静态广播监听器的方法
  6. 系出名门
  7. Android 下拉菜单 Spinner 赋值
  8. Android 比较全面的自定义刷新空间
  9. Android(安卓)自定义View练手Demo(三)实现
  10. android intent FLAG_ACTIVITY_CLEAR_TOP