Java 如何在打开导航抽屉时缩小后台活动?
我想在打开Java 如何在打开导航抽屉时缩小后台活动?,java,android,animation,android-activity,navigation-drawer,Java,Android,Animation,Android Activity,Navigation Drawer,我想在打开导航抽屉时,将我的背景活动缩小一点,模拟Airbnb应用程序中存在的效果。我想最好的解释应该是屏幕截图: 但重点不是使视图变小,而是使其成为与抽屉打开/关闭动画同步的动画。因此,如果你打开抽屉,中间的人决定停下来,背景活动量表也会相应地受到影响。 如何使用内置抽屉布局实现这一点?是否有一些实现 如果您查看一下第三方库,它应该有您想要的一切 您感兴趣的是ScrollScale后面的,上面写着: behindScrollScale-表示上视图滚动和后视图滚动之间关系的浮点。如果设置为0.
导航抽屉
时,将我的背景活动
缩小一点,模拟Airbnb
应用程序中存在的效果。我想最好的解释应该是屏幕截图:
但重点不是使视图变小,而是使其成为与抽屉打开/关闭动画同步的动画。因此,如果你打开抽屉,中间的人决定停下来,背景活动量表也会相应地受到影响。
如何使用内置抽屉布局实现这一点?是否有一些实现 如果您查看一下第三方库,它应该有您想要的一切 您感兴趣的是ScrollScale后面的
,上面写着:
behindScrollScale-表示上视图滚动和后视图滚动之间关系的浮点。如果设置为0.5f,则上一视图每滚动2px,后视图将滚动1px。如果设置为1.0f,则上一视图每滚动1px,后视图将滚动1px。如果设置为0.0f,后视图将永远不会滚动;它将是静态的。这一个很好玩。默认值为0.25f
您可以使用支持库v4中的执行此效果
您所要做的就是重写onDrawerSlide方法来检索抽屉菜单的开始百分比,然后缩放片段所在的FrameLayout
代码示例:
main_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"/>
</android.support.v4.widget.DrawerLayout>
请注意,我使用了两种不同的方法进行缩放,因为setScaleX/Y在之前的Android版本中不可用
有了这个,您可以设置自己的scaleFactor(我认为0.9f已经足够小了),或者根据抽屉的开口百分比尝试新的效果(更改颜色)
希望对你有所帮助。嘿,你也可以为较小的活动提供最佳效果。检查
使用库进行演示 我想你可能是对的,但我正确地使用了内置抽屉布局,我不是真的想更改这个实现,而是想添加到它。还有其他方法可以做到吗?我不认为用本地抽屉布局就可以了。声明内容不应移动,抽屉应出现在内容上方,因此我怀疑他们是否会支持打破这一点的内容。非常感谢,这看起来是正确的答案,我唯一的问题是,在我的应用程序中,NavDrawer活动基本上是我所有其他活动的包装活动,所以我想调整的布局不是直接在同一个活动中,所以我不知道如何得到它的实例。这是您的示例中的框架实例。我会看看我能做些什么,并很快接受你们的答案。你们的解决方案是完美的,我测试了它,然后在我的代码中做了必要的更改,它按预期工作。不同sdk版本的动画方法添加得很好,虽然我已经意识到了这一点,但可以对其他人有所帮助。非常感谢:)我很高兴它帮助了你!完美的非常感谢图标抽屉(ic_抽屉)未移动或切换。只需删除onDrawerClose和onDrawerOpen侦听器,并更改为此处引用的slideOffset的if语句
public class ConfigurerActivity extends ActionBarActivity
{
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private FrameLayout frame;
private float lastScale = 1.0f;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
frame = (FrameLayout) findViewById(R.id.content_frame);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.acc_drawer_open, R.string.acc_drawer_close)
{
@SuppressLint("NewApi")
public void onDrawerSlide(View drawerView, float slideOffset)
{
float min = 0.9f;
float max = 1.0f;
float scaleFactor = (max - ((max - min) * slideOffset));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
frame.setScaleX(scaleFactor);
frame.setScaleY(scaleFactor);
}
else
{
ScaleAnimation anim = new ScaleAnimation(lastScale, scaleFactor, lastScale, scaleFactor, frame.getWidth()/2, frame.getHeight()/2);
anim.setDuration(0);
anim.setFillAfter(true);
frame.startAnimation(anim);
lastScale = scaleFactor;
}
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
// ... more of your code
}
}