Skip to content

Commit

Permalink
support fade
Browse files Browse the repository at this point in the history
  • Loading branch information
wujingchao committed Apr 18, 2015
1 parent 11743ed commit 4ed5753
Show file tree
Hide file tree
Showing 6 changed files with 176 additions and 81 deletions.
14 changes: 7 additions & 7 deletions app/src/main/java/net/wujingchao/android/demo/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,22 @@
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;

import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.view.ViewHelper;

import net.wujingchao.android.view.MultiCardMenu;


public class MainActivity extends ActionBarActivity {

private final static String TAG = "MainActivity";

MultiCardMenu mc;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MultiCardMenu mc = (MultiCardMenu) findViewById(R.id.mc);
mc = (MultiCardMenu) findViewById(R.id.mc);
mc.setOnDisplayOrHideListener(new MultiCardMenu.OnDisplayOrHideListener() {
@Override
public void onDisplay(int which) {
Expand All @@ -30,12 +28,14 @@ public void onDisplay(int which) {

@Override
public void onHide(int which) {
Log.d(TAG,"onHide:" + which);
Log.d(TAG, "onHide:" + which);
}
});
}


public void go(View view) {
Toast.makeText(this,"gogo",Toast.LENGTH_SHORT).show();
Toast.makeText(this,"getDisplayingCard:" + mc.getDisplayingCard(),Toast.LENGTH_SHORT).show();
}

}
86 changes: 47 additions & 39 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
@@ -1,26 +1,19 @@
<RelativeLayout
xmlns:android="http:https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray">

<!-- <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt"
android:text="Button"
android:onClick="tranlate"/>-->
android:layout_height="match_parent">

<net.wujingchao.android.view.MultiCardMenu
xmlns:simple="http:https://schemas.android.com/apk/res-auto"
simple:background_layout="@layout/main2"
simple:margin_top="80dp"
simple:fade="true"
android:id="@+id/mc"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:layout_alignParentBottom="true">
<LinearLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dip"
android:layout_marginTop="30dip"
Expand All @@ -36,37 +29,52 @@
android:text="清理加速"/>
</LinearLayout>

<FrameLayout
android:layout_width="match_parent"
android:layout_height="300dip"
android:background="@color/holo_green_dark">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="防护监控"/>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dip"
android:background="@color/holo_green_dark">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GO"
android:onClick="go"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="防护监控"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dip"
android:background="@color/holo_red_dark">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GO"
android:onClick="go"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="软件管理"/>
</LinearLayout>

<FrameLayout
android:layout_width="match_parent"
android:layout_height="300dip"
android:background="@color/holo_red_dark">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="软件管理"/>
</FrameLayout>

<FrameLayout
android:layout_width="match_parent"
android:layout_height="300dip"
android:background="@color/ripple_material_light">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:text=" 通话管理"/>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dip"
android:background="@color/ripple_material_light">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GO"
android:onClick="go"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:text=" 通话管理"/>
</LinearLayout>

</net.wujingchao.android.view.MultiCardMenu>


</RelativeLayout>
5 changes: 3 additions & 2 deletions app/src/main/res/layout/main2.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:https://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package net.wujingchao.android.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.widget.FrameLayout;

/**
* @author wujingchao 2015-04-18 email:[email protected]
*/
class DarkFrameLayout extends FrameLayout {

public final static int MAX_ALPHA = 0x7f;

private Paint mFadePaint;

private int alpha = 0x00;

public DarkFrameLayout(Context context) {
this(context, null);
}

public DarkFrameLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}


public DarkFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mFadePaint = new Paint();
}

@Override
protected void dispatchDraw(@NonNull Canvas canvas) {
super.dispatchDraw(canvas);
drawFade(canvas);
}

private void drawFade(Canvas canvas) {
mFadePaint.setColor(Color.argb(alpha, 0, 0, 0));
canvas.drawRect(0, 0, getMeasuredWidth(), getHeight(), mFadePaint);
}

public void fade(boolean fade) {
this.alpha = fade ? 0x8f : 0x00;
invalidate();
}

public void fade(int alpha) {
this.alpha = alpha;
invalidate();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.NonNull;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
Expand Down Expand Up @@ -111,6 +111,10 @@ public void onAnimationRepeat(Animator animator) {

private boolean isAnimating = false;

private DarkFrameLayout mDarkFrameLayout;

private boolean isFade;

public MultiCardMenu(Context context) {
this(context,null);
}
Expand All @@ -121,22 +125,29 @@ public MultiCardMenu(Context context, AttributeSet attrs) {

public MultiCardMenu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
ViewConfiguration vc = ViewConfiguration.get(context);
mMaxVelocity = vc.getScaledMaximumFlingVelocity();
mMinVelocity = vc.getScaledMinimumFlingVelocity() * 2;
mDensity = context.getResources().getDisplayMetrics().density;
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MultiCardMenu, defStyleAttr, 0);
mTitleBarHeightOnSpread = a.getDimension(R.styleable.MultiCardMenu_title_bar_height_on_spread,dip2px(DEFAULT_TITLE_BAR_HEIGHT_ON_SPREAD));
mTitleBarHeightOnFold = a.getDimension(R.styleable.MultiCardMenu_title_bar_height_on_fold, dip2px(DEFAULT_TITLE_BAR_HEIGHT_ON_FOLD));
mMarginTop = a.getDimension(R.styleable.MultiCardMenu_margin_top, dip2px(DEFAULT_CARD_MARGIN_TOP));
mMoveDistanceToTrigger = a.getDimension(R.styleable.MultiCardMenu_move_distance_to_trigger,dip2px(DEFAULT_MOVE_DISTANCE_TO_TRIGGER));
int mBackgroundRid = a.getResourceId(R.styleable.MultiCardMenu_background_layout,-1);
mDuration = a.getInt(R.styleable.MultiCardMenu_animator_duration,DEFAULT_DURATION);
isFade = a.getBoolean(R.styleable.MultiCardMenu_fade,true);
a.recycle();
if(mBackgroundRid != -1) {
LayoutInflater.from(context).inflate(mBackgroundRid,this);
if(isFade) {
mDarkFrameLayout = new DarkFrameLayout(context);
mDarkFrameLayout.addView(LayoutInflater.from(context).inflate(mBackgroundRid, null));
addView(mDarkFrameLayout);
}else {
LayoutInflater.from(context).inflate(mBackgroundRid, this);
}
isExistBackground = true;
}
mDuration = a.getInt(R.styleable.MultiCardMenu_animator_duration,DEFAULT_DURATION);
a.recycle();
ViewConfiguration vc = ViewConfiguration.get(context);
mMaxVelocity = vc.getScaledMaximumFlingVelocity();
mMinVelocity = vc.getScaledMinimumFlingVelocity() * 2;
}

@Override
Expand Down Expand Up @@ -261,22 +272,26 @@ private void computeVelocity() {
}

private void displayCard(final int which) {
//TODO add fade
if(isDisplaying || isAnimating)return;
if(isFade && mDarkFrameLayout != null) mDarkFrameLayout.fade(true);
List<Animator> animators = new ArrayList<>(mChildCount);
ObjectAnimator displayAnimator = ObjectAnimator
.ofFloat(getChildAt(which), "y", ViewHelper.getY(getChildAt(which)), mMarginTop)
.setDuration(mDuration);
// ValueAnimator displayAnimator = ValueAnimator.ofFloat(ViewHelper.getY(getChildAt(which)), mMarginTop)
// .setDuration(mDuration);
// displayAnimator.setTarget(getChildAt(which));
// displayAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
// @Override
// public void onAnimationUpdate(ValueAnimator valueAnimator) {
// float value = (float) valueAnimator.getAnimatedValue();
// ViewHelper.setY(getChildAt(which),value);
// }
// });
// ObjectAnimator displayAnimator = ObjectAnimator
// .ofFloat(getChildAt(which), "y", ViewHelper.getY(getChildAt(which)), mMarginTop)
// .setDuration(mDuration);
final float distance = ViewHelper.getY(getChildAt(which)) - mMarginTop;
ValueAnimator displayAnimator = ValueAnimator.ofFloat(ViewHelper.getY(getChildAt(which)), mMarginTop)
.setDuration(mDuration);
displayAnimator.setTarget(getChildAt(which));
displayAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float value = (float) valueAnimator.getAnimatedValue();
ViewHelper.setY(getChildAt(which), value);
if(mDarkFrameLayout != null && isFade) {
mDarkFrameLayout.fade((int) ((1-(value - mMarginTop)/distance) * DarkFrameLayout.MAX_ALPHA));
}
}
});
animators.add(displayAnimator);
int n = isExistBackground ? (mChildCount - 1) : mChildCount;
for(int i = 0,j = 1; i < mChildCount; i++) {
Expand Down Expand Up @@ -306,18 +321,22 @@ private void hideCard(int which) {
List<Animator> animators = new ArrayList<>(mChildCount);
final View displayingCard = getChildAt(which);
int t = (int) (getMeasuredHeight() - (mChildCount - which)* mTitleBarHeightOnSpread);
ObjectAnimator displayAnimator = ObjectAnimator.ofFloat(displayingCard, "y",
ViewHelper.getY(displayingCard), t).setDuration(mDuration);
// ValueAnimator displayAnimator = ValueAnimator.ofFloat(ViewHelper.getY(displayingCard), t)
// .setDuration(mDuration);
// displayAnimator.setTarget(displayingCard);
// displayAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
// @Override
// public void onAnimationUpdate(ValueAnimator valueAnimator) {
// float value = (float) valueAnimator.getAnimatedValue();
// ViewHelper.setY(displayingCard,value);
// }
// });
// ObjectAnimator displayAnimator = ObjectAnimator.ofFloat(displayingCard, "y",
// ViewHelper.getY(displayingCard), t).setDuration(mDuration);
ValueAnimator displayAnimator = ValueAnimator.ofFloat(ViewHelper.getY(displayingCard), t)
.setDuration(mDuration);
displayAnimator.setTarget(displayingCard);
final int finalT = t;
displayAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float value = (float) valueAnimator.getAnimatedValue();
ViewHelper.setY(displayingCard,value);
if(mDarkFrameLayout != null && isFade && value < finalT) {
mDarkFrameLayout.fade((int) ((1 - value/ finalT) * DarkFrameLayout.MAX_ALPHA));
}
}
});
animators.add(displayAnimator);
for(int i = 0; i < mChildCount; i ++) {
if(i == 0 && isExistBackground) continue;
Expand Down Expand Up @@ -347,6 +366,15 @@ public void setInterpolator(Interpolator interpolator) {
this.mInterpolator = interpolator;
}


/**
*
* @return less than 0 :No Display Card
*/
public int getDisplayingCard() {
return isExistBackground ? (mDisplayingCard - 1) : mDisplayingCard;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return isDragging;
Expand Down
1 change: 1 addition & 0 deletions multi-card-menu/src/main/res/values/attr.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
<attr name="margin_top" format="dimension"/>
<attr name="background_layout" format="reference"/>
<attr name="animator_duration" format="integer"/>
<attr name="fade" format="boolean"/>
</declare-styleable>
</resources>

0 comments on commit 4ed5753

Please sign in to comment.