Вы можете выполнить этот эффект с помощью ActionBarDrawerToggle в библиотеке поддержки 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>
Теперь в вашей деятельности, которая содержит ящик:
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
}
}
Обратите внимание, что я использую 2 разных метода для масштабирования, потому что setScaleX/Y недоступен в версиях PRE - Honeycomb для Android.
При этом вы можете установить свой собственный масштабный коэффициент (я думаю, что 0,9f достаточно мал) или, возможно, попробовать новые эффекты (изменить цвет) на основе процента открытия ящика.
Надеюсь, поможет.
person
nsL
schedule
30.11.2013