继承HorizontalScrollView实现侧滑菜单 :主界面缩放动画
package com.example.zxtext.diyUi;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import com.example.zxtext.R;
import androidx.core.view.ViewCompat;
public class SlidingMenu extends HorizontalScrollView {
private View mMenuView;
private View mContentView;
private int mMenuWidth;
private boolean mMenuIsOpen = false;
private GestureDetector mGestureDetector;
public SlidingMenu(Context context) {
this(context,null);
}
public SlidingMenu(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public SlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SlidingMenu);
float rightPadding = array.getDimension(R.styleable.SlidingMenu_SlidingMenu_rightPadding,dip2px(50));
mMenuWidth = (int) (getScreenWidth() - rightPadding);
array.recycle();
mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(mMenuIsOpen){
if(velocityX<-500){
toggleMenu();
return true;
}
}else{
if(velocityX>500){
toggleMenu();
return true;
}
}
return false;
}
});
}
private float dip2px(int dip) {
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dip,getResources().getDisplayMetrics());
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
ViewGroup container = (ViewGroup) this.getChildAt(0);
int containerChildCount = container.getChildCount();
if(containerChildCount>2){
throw new IllegalStateException("SlidingMenu 根布局LinearLayout下面只允许两个布局,菜单布局和主页内容布局");
}
mMenuView = container.getChildAt(0);
mContentView = container.getChildAt(1);
mMenuView.getLayoutParams().width = mMenuWidth;
mContentView.getLayoutParams().width = getScreenWidth();
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (changed) {
scrollTo(mMenuWidth, 0);
}
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
float scale = (1f*l)/mMenuWidth;
float rightScale = (float) (0.7f + 0.3*scale);
ViewCompat.setPivotX(mContentView,0);
ViewCompat.setPivotY(mContentView,getMeasuredHeight()/2);
ViewCompat.setScaleX(mContentView,rightScale);
ViewCompat.setScaleY(mContentView,rightScale);
float leftScale = (float) (1 - 0.3*scale);
float alphaScale = (float) (1 - 1*scale);
ViewCompat.setScaleX(mMenuView,leftScale);
ViewCompat.setScaleY(mMenuView,leftScale);
ViewCompat.setAlpha(mMenuView,alphaScale);
ViewCompat.setTranslationX(mMenuView,l*0.3f);
}
public int getScreenWidth() {
Resources resources = this.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
return dm.widthPixels;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(mGestureDetector.onTouchEvent(ev)){
return mGestureDetector.onTouchEvent(ev);
}
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
int currentScrollX = getScrollX();
if (currentScrollX > mMenuWidth / 2) {
closeMenu();
} else {
openMenu();
}
return false;
}
return super.onTouchEvent(ev);
}
private void openMenu() {
smoothScrollTo(0,0);
mMenuIsOpen = true;
}
private void closeMenu() {
smoothScrollTo(mMenuWidth,0);
mMenuIsOpen = false;
}
private void toggleMenu() {
if(mMenuIsOpen){
closeMenu();
}else{
openMenu();
}
}
}
<com.example.zxtext.diyUi.SlidingMenu
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scrollbars="none"
android:fadingEdge="none"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >
<include layout="@layout/sliding_item" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/ic_launcher_background">
</LinearLayout>
</LinearLayout>
</com.example.zxtext.diyUi.SlidingMenu>