实现android侧边栏效果
场景:简略实现android侧边栏效果
简单实现android侧边栏效果
用于项目中可能要用到此功能,于是就看了下相关代码,发现网上很多人的实现方式都是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;
}
}
简单实现android侧边栏效果
用于项目中可能要用到此功能,于是就看了下相关代码,发现网上很多人的实现方式都是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;
}
}