Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在打开导航抽屉时缩小后台活动?_Java_Android_Animation_Android Activity_Navigation Drawer - Fatal编程技术网

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
    }
}