Animations for vertical bottom menu.

This commit is contained in:
Dmitry Yunitsky 2014-08-20 16:56:37 +03:00 committed by Alex Zolotarev
parent 762dcf3c6c
commit db057d1443
4 changed files with 123 additions and 52 deletions

View file

@ -30,18 +30,24 @@
android:layout_height="match_parent"
android:layout_below="@id/search_box"/>
<FrameLayout
<View
android:id="@+id/fade_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:visibility="gone"/>
<include
android:id="@+id/map_bottom_toolbar"
layout="@layout/map_bottom_toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_panel_height"
android:layout_alignParentBottom="true"/>
<include
android:id="@+id/map_bottom_vertical_toolbar"
layout="@layout/map_bottom_vertical_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<include
android:id="@+id/map_bottom_toolbar"
layout="@layout/map_bottom_toolbar"/>
<include
android:id="@+id/map_bottom_vertical_toolbar"
layout="@layout/map_bottom_vertical_toolbar"/>
</FrameLayout>
android:layout_alignParentBottom="true"/>
</RelativeLayout>

View file

@ -23,6 +23,8 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@ -99,8 +101,12 @@ public class MWMActivity extends NvEventQueueActivity
// Initialized to invalid combination to force update on the first check
private boolean mStorageAvailable = false;
private boolean mStorageWritable = true;
// toolbars
private static final long VERT_TOOLBAR_ANIM_DURATION = 250;
private ViewGroup mVerticalToolbar;
private ViewGroup mToolbar;
private Animation mVerticalToolbarAnimation;
private View mFadeView;
private static final String IS_KML_MOVED = "KmlBeenMoved";
private static final String IS_KITKAT_MIGRATION_COMPLETED = "KitKatMigrationCompleted";
@ -620,8 +626,67 @@ public class MWMActivity extends NvEventQueueActivity
public void onMoreClicked(View v)
{
UiUtils.show(mVerticalToolbar);
UiUtils.hide(mToolbar);
setVerticalToolbarVisible(true);
}
private void setVerticalToolbarVisible(boolean showVerticalToolbar)
{
if (mVerticalToolbarAnimation != null ||
(mVerticalToolbar.getVisibility() == View.VISIBLE && showVerticalToolbar) ||
(mVerticalToolbar.getVisibility() != View.VISIBLE && !showVerticalToolbar))
return;
int fromY, toY;
Animation.AnimationListener listener;
float fromAlpha, toAlpha;
if (showVerticalToolbar)
{
fromY = 1;
toY = 0;
fromAlpha = 0.0f;
toAlpha = 0.5f;
listener = new UiUtils.SimpleAnimationListener()
{
@Override
public void onAnimationStart(Animation animation)
{
mVerticalToolbar.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation)
{
mVerticalToolbarAnimation = null;
}
};
}
else
{
fromY = 0;
toY = 1;
fromAlpha = 0.5f;
toAlpha = 0.0f;
listener = new UiUtils.SimpleAnimationListener()
{
@Override
public void onAnimationEnd(Animation animation)
{
mVerticalToolbar.setVisibility(View.INVISIBLE);
mVerticalToolbarAnimation = null;
}
};
}
// slide vertical toolbar
mVerticalToolbarAnimation = UiUtils.generateSlideAnimation(0, 0, fromY, toY);
mVerticalToolbarAnimation.setDuration(VERT_TOOLBAR_ANIM_DURATION);
mVerticalToolbarAnimation.setAnimationListener(listener);
mVerticalToolbar.startAnimation(mVerticalToolbarAnimation);
// fade map
Animation alphaAnimation = new AlphaAnimation(fromAlpha, toAlpha);
alphaAnimation.setFillBefore(true);
alphaAnimation.setFillAfter(true);
alphaAnimation.setDuration(VERT_TOOLBAR_ANIM_DURATION);
mFadeView.startAnimation(alphaAnimation);
}
private void shareMyLocation()
@ -759,15 +824,19 @@ public class MWMActivity extends NvEventQueueActivity
mVerticalToolbar.findViewById(R.id.btn_settings).setOnClickListener(this);
View moreApps = mVerticalToolbar.findViewById(R.id.btn_more_apps);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB || Framework.getGuideIds().length == 0)
{
UiUtils.hide(moreApps);
}
else
{
moreApps.setOnClickListener(this);
}
UiUtils.hide(mVerticalToolbar);
UiUtils.invisible(mVerticalToolbar);
// hacky way to implement alpha at pre-honeycomb SDK.
mFadeView = findViewById(R.id.fade_view);
Animation alphaAnimation = new AlphaAnimation(0.0f, 0.0f);
alphaAnimation.setFillAfter(true);
alphaAnimation.setDuration(0);
mFadeView.startAnimation(alphaAnimation);
mFadeView.setVisibility(View.VISIBLE);
}
private void setUpInfoBox()
@ -1127,10 +1196,7 @@ public class MWMActivity extends NvEventQueueActivity
deactivatePopup();
}
else if (mVerticalToolbar.getVisibility() == View.VISIBLE)
{
UiUtils.show(mToolbar);
UiUtils.hide(mVerticalToolbar);
}
setVerticalToolbarVisible(false);
else
super.onBackPressed();
}
@ -1283,13 +1349,13 @@ public class MWMActivity extends NvEventQueueActivity
@Override
public void onPreviewVisibilityChanged(boolean isVisible)
{
UiUtils.hide(mVerticalToolbar);
setVerticalToolbarVisible(false);
}
@Override
public void onPlacePageVisibilityChanged(boolean isVisible)
{
UiUtils.hide(mVerticalToolbar);
setVerticalToolbarVisible(false);
}
@Override
@ -1298,28 +1364,23 @@ public class MWMActivity extends NvEventQueueActivity
switch (v.getId())
{
case R.id.btn_buy_pro:
UiUtils.hide(mVerticalToolbar);
UiUtils.show(mToolbar);
setVerticalToolbarVisible(false);
UiUtils.runProMarketActivity(MWMActivity.this);
break;
case R.id.btn_share:
UiUtils.hide(mVerticalToolbar);
UiUtils.show(mToolbar);
setVerticalToolbarVisible(false);
shareMyLocation();
break;
case R.id.btn_settings:
UiUtils.hide(mVerticalToolbar);
UiUtils.show(mToolbar);
setVerticalToolbarVisible(false);
startActivity(new Intent(this, SettingsActivity.class));
break;
case R.id.btn_download_maps:
UiUtils.hide(mVerticalToolbar);
UiUtils.show(mToolbar);
setVerticalToolbarVisible(false);
runDownloadActivity();
break;
case R.id.btn_more_apps:
UiUtils.hide(mVerticalToolbar);
UiUtils.show(mToolbar);
setVerticalToolbarVisible(false);
startActivity(new Intent(this, MoreAppsActivity.class));
break;
default:
@ -1330,8 +1391,12 @@ public class MWMActivity extends NvEventQueueActivity
@Override
public boolean onTouch(View view, MotionEvent event)
{
UiUtils.hide(mVerticalToolbar);
UiUtils.show(mToolbar);
// if vertical toolbar is visible - hide it and ignore touch
if (mVerticalToolbar.getVisibility() == View.VISIBLE)
{
setVerticalToolbarVisible(false);
return true;
}
if (mInfoView.getState() == State.FULL_PLACEPAGE)
{
deactivatePopup();

View file

@ -258,7 +258,7 @@ public class MapInfoView extends LinearLayout implements View.OnClickListener
TranslateAnimation slide;
if (show) // slide up
{
slide = generateSlideAnimation(0, 0, -1, 0);
slide = UiUtils.generateSlideAnimation(0, 0, -1, 0);
slide.setDuration(SHORT_ANIM_DURATION);
UiUtils.show(mPlacePageGroup);
UiUtils.hide(mArrow);
@ -267,7 +267,7 @@ public class MapInfoView extends LinearLayout implements View.OnClickListener
}
else // slide down
{
slide = generateSlideAnimation(0, 0, 0, -1);
slide = UiUtils.generateSlideAnimation(0, 0, 0, -1);
slide.setDuration(SHORT_ANIM_DURATION);
slide.setFillEnabled(true);
@ -298,7 +298,7 @@ public class MapInfoView extends LinearLayout implements View.OnClickListener
TranslateAnimation slide;
if (show)
{
slide = generateSlideAnimation(0, 0, -1, 0);
slide = UiUtils.generateSlideAnimation(0, 0, -1, 0);
UiUtils.show(mPreviewGroup);
slide.setAnimationListener(new SimpleAnimationListener()
{
@ -312,7 +312,7 @@ public class MapInfoView extends LinearLayout implements View.OnClickListener
}
else
{
slide = generateSlideAnimation(0, 0, 0, -1);
slide = UiUtils.generateSlideAnimation(0, 0, 0, -1);
slide.setAnimationListener(new SimpleAnimationListener()
{
@Override
@ -332,7 +332,7 @@ public class MapInfoView extends LinearLayout implements View.OnClickListener
private void hideEverything()
{
final TranslateAnimation slideDown = generateSlideAnimation(0, 0, 0, -1);
final TranslateAnimation slideDown = UiUtils.generateSlideAnimation(0, 0, 0, -1);
slideDown.setDuration(LONG_ANIM_DURATION);
slideDown.setAnimationListener(new SimpleAnimationListener()
@ -760,15 +760,6 @@ public class MapInfoView extends LinearLayout implements View.OnClickListener
.drawCircleForPin(to, (int) getResources().getDimension(R.dimen.color_chooser_radius), getResources()));
}
private TranslateAnimation generateSlideAnimation(float fromX, float toX, float fromY, float toY)
{
return new TranslateAnimation(
Animation.RELATIVE_TO_SELF, fromX,
Animation.RELATIVE_TO_SELF, toX,
Animation.RELATIVE_TO_SELF, fromY,
Animation.RELATIVE_TO_SELF, toY);
}
@Override
public void onClick(View v)
{

View file

@ -21,6 +21,7 @@ import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
@ -103,6 +104,15 @@ public final class UiUtils
target.startAnimation(anim);
}
public static TranslateAnimation generateSlideAnimation(float fromX, float toX, float fromY, float toY)
{
return new TranslateAnimation(
Animation.RELATIVE_TO_SELF, fromX,
Animation.RELATIVE_TO_SELF, toX,
Animation.RELATIVE_TO_SELF, fromY,
Animation.RELATIVE_TO_SELF, toY);
}
public static Drawable setCompoundDrawableBounds(int drawableId, int dimenId, Resources res)
{
return setCompoundDrawableBounds(res.getDrawable(drawableId), dimenId, res);
@ -349,7 +359,6 @@ public final class UiUtils
return "hdpi";
}
// utility class
private UiUtils()
{}