受了張鴻洋大神這篇博文的啓發: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();
}
}
}