受了张鸿洋大神这篇博文的启发:http://blog.csdn.net/lmj623565791/article/details/39257409
截图效果如下(由于截图是白底的所以看起来怪怪的):
这个效果是旧版的多看阅读里面的效果,即上拉的时候会跟随手指出现一个菜单,当手指离开屏幕的时候,如果手指滑动的距离大于菜单高度的一半就会滑上去,否则滑下去
代码如下:
package com.jsbtclient.view;
import com.jsbt.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.ScrollView;
public class SlidingUpMenu extends ScrollView {
/**
* 屏幕高度
*/
private int mScreenHeight;
/**
* 菜单高度
*/
private int mBottomMenuHeight;
/**
* 菜单高度/2
*/
private int halfBottomMenuHeight;
/**
* 菜单高度 = 屏幕高度 - Padding值
* 下面就会看到
*/
private int mBottomMenuTopPadding;
/**
* menu
*/
View mBottomMenu;
View mContent;
private boolean isBottomOpen = false;
public SlidingUpMenu(Context context) {
this(context, null);
}
public SlidingUpMenu(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlidingUpMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
/**
* 获取屏幕高度
*/
mScreenHeight = getScreenHeight();
TypedArray array = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.SlidingUpMenu, defStyle, 0);
int num = array.getIndexCount();
for (int i = 0; i < num; i++) {
int attr = array.getIndex(i);
/**
* 获取用户设置的topPadding
* 如果topPadding = 100dp, 则bottomMenu的高度 = ScreenHeight - 100dp对应的px值
*
*/
switch (attr) {
case R.styleable.SlidingUpMenu_topPadding:
mBottomMenuTopPadding = array.getDimensionPixelSize(attr,
(int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50f,
getResources().getDisplayMetrics()));
break;
default:
break;
}
}
}
public int getScreenHeight() {
WindowManager wm = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.heightPixels;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
LinearLayout wrapper = (LinearLayout) getChildAt(0);
mContent = (View) wrapper.getChildAt(0);
mBottomMenu = (View) wrapper.getChildAt(1);
mBottomMenuHeight = mScreenHeight - mBottomMenuTopPadding;
mBottomMenu.getLayoutParams().height = mBottomMenuHeight;//重置底部菜单的高度
halfBottomMenuHeight = mBottomMenuHeight / 2;
mContent.getLayoutParams().height = mScreenHeight;//设置内容区的高度始终等于屏幕高度
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction())
{
case MotionEvent.ACTION_UP:
int scrolly = getScrollY();
if (scrolly > halfBottomMenuHeight)
{
smoothScrollTo(0, mBottomMenuHeight);
isBottomOpen = true;
} else {
smoothScrollTo(0, 0);
isBottomOpen = false;
}
return true;
default:
break;
}
return super.onTouchEvent(ev);
}
public boolean isBottomOpen() {
return isBottomOpen;
}
public void openBottomMenu() {
if (!isBottomOpen) {
smoothScrollTo(0, mBottomMenuHeight);
isBottomOpen = true;
}
}
public void closeBottomMenu() {
if (isBottomOpen) {
smoothScrollTo(0, 0);
isBottomOpen = false;
}
}
public void toggleBottomMenu() {
if (isBottomOpen) {
closeBottomMenu();
} else {
openBottomMenu();
}
}
}