简单实现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;
}
}

猜你喜欢

转载自yangsongjing.iteye.com/blog/1975527