在滑动时移动和调整DrawerLayout的内容

时间:2016-05-19 22:52:44

标签: android drawerlayout

我刚刚遇到这个应用,看到了View的自定义动画。 我猜它必须先截取屏幕截图,然后在Activity中绘制自定义server { listen 443 ssl; server_name lefthookservices.com www.lefthookservices.com; ssl_certificate /etc/letsencrypt/live/lefthookservices.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/lefthookservices.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-$ ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security max-age=15768000; location / { proxy_pass http://127.0.0.1:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } location ~ /.well-known { allow all; } } server { listen 80; server_name lefthookservices.com www.lefthookservices.com; return 301 https://$host$request_uri; } ,但我不确定,也不确定细节。 有谁知道怎么做?

enter image description here

2 个答案:

答案 0 :(得分:18)

您可以通过在View onDrawerSlide()的{​​{1}}方法中翻译和缩放内容DrawerListener来实现此目的。由于内容DrawerLayout本身正在调整大小,并且右下角会显示单独的View,因此我们会将这两个内容粘贴到另一个持有者TextView中。如果不需要该标签ViewGroup,也可以省略持有人TextView

示例的基本ViewGroup设置:

DrawerLayout

示例<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" android:background="#222222"> <RelativeLayout android:id="@+id/holder" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="#E97411" /> <ImageView android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#EEEEEE" android:src="@drawable/ic_launcher" /> </LinearLayout> <TextView android:id="@+id/label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:visibility="gone" android:textSize="26dp" android:text="My App" /> </RelativeLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="left" android:background="#555555" /> </android.support.v4.widget.DrawerLayout> 显示标准Activity初始化以及实际正在开展工作的View

DrawerListener

该示例使用public class MainActivity extends AppCompatActivity { private static final float END_SCALE = 0.7f; private DrawerLayout drawerLayout; private NavigationView navigationView; private Toolbar toolbar; private TextView labelView; private View contentView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); navigationView = (NavigationView) findViewById(R.id.navigation_view); toolbar = (Toolbar) findViewById(R.id.toolbar); labelView = (TextView) findViewById(R.id.label); contentView = findViewById(R.id.content); toolbar.setNavigationIcon(new DrawerArrowDrawable(this)); toolbar.setNavigationOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (drawerLayout.isDrawerOpen(navigationView)) { drawerLayout.closeDrawer(navigationView); } else { drawerLayout.openDrawer(navigationView); } } } ); drawerLayout.setScrimColor(Color.TRANSPARENT); drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerSlide(View drawerView, float slideOffset) { labelView.setVisibility(slideOffset > 0 ? View.VISIBLE : View.GONE); // Scale the View based on current slide offset final float diffScaledOffset = slideOffset * (1 - END_SCALE); final float offsetScale = 1 - diffScaledOffset; contentView.setScaleX(offsetScale); contentView.setScaleY(offsetScale); // Translate the View, accounting for the scaled width final float xOffset = drawerView.getWidth() * slideOffset; final float xOffsetDiff = contentView.getWidth() * diffScaledOffset / 2; final float xTranslation = xOffset - xOffsetDiff; contentView.setTranslationX(xTranslation); } @Override public void onDrawerClosed(View drawerView) { labelView.setVisibility(View.GONE); } } ); } } ,但SimpleDrawerListener方法可以在onDrawerSlide()中类似地覆盖,如果使用的话。在这种情况下,需要调用ActionBarDrawerToggle方法来保存汉堡包箭头动画。

请注意superDrawerLayout重新播放期间保留抽屉状态,因此您在处理方向更改等时可能需要考虑这一点。

答案 1 :(得分:0)

抽屉行为是一个使用Android DrawerLayout支持库作为父类[易于迁移]的库,它在抽屉上提供了额外的行为,例如在抽屉上滑动幻灯片时移动视图或缩放视图的高度。

如果当前项目使用Android DrawerLayout支持库,并且有点无聊。然后,只需更改布局代码并调用必要的动画/效果方法即可。

Check out github code

Gradle

dependencies {
   implementation 'com.infideap.drawerbehavior:drawer-behavior:0.1.5'
}

如果gradle无法同步,则​​可以将此行包含在项目级别gradle中,

repositories {
 maven{
   url "https://dl.bintray.com/infideap2/Drawer-Behavior"
 }
}