android防谷歌滑动效果,谷歌是如何做到这一点的?在Android应用程序中滑动ActionBar...
事實上,有一種方法可以做到這一點。即使沒有實施自己的ActionBar。
看看hierachyviewer吧!(位于工具目錄中)
還有的DecorView,并且LinearLayout作為一個孩子。這LinearLayout包含ActionBar其他內容和其他內容。所以,你可以簡單地應用一些FrameLayout.LayoutParams,LinearLayout并以這種方式在左側獲得一些空間。然后,您可以使用菜單ListView填充此空間,并使用FrameLayout覆蓋其他內容,當單擊它時,折疊菜單。所以,這里有一些代碼:
首先,折疊/擴展類(SlideMenu.java):package?your.cool.app;import?android.app.Activity;import?android.content.Context;import?android.content.Intent;import?android.graphics.Rect;import?android.util.Log;import?android.view.LayoutInflater;import?android.view.View;import?android.view.View.OnClickListener;import?android.view.ViewGroup;import?android.view.Window;import?android.view.animation.TranslateAnimation;import?android.widget.AdapterView;import?android.widget.AdapterView.OnItemClickListener;import?android.widget.ArrayAdapter;import?android.widget.FrameLayout;import?android.widget.ImageView;import?android.widget.LinearLayout;import?android.widget.ListView;import?android.widget.TextView;public?class?SlideMenu?{//just?a?simple?adapterpublic?static?class?SlideMenuAdapter?extends?ArrayAdapter?{
Activity?act;
SlideMenu.SlideMenuAdapter.MenuDesc[]?items;
class?MenuItem?{
public?TextView?label;
public?ImageView?icon;
}
static?class?MenuDesc?{
public?int?icon;
public?String?label;
}
public?SlideMenuAdapter(Activity?act,?SlideMenu.SlideMenuAdapter.MenuDesc[]?items)?{
super(act,?R.id.menu_label,?items);
this.act?=?act;
this.items?=?items;
}
@Override
public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{
View?rowView?=?convertView;
if?(rowView?==?null)?{
LayoutInflater?inflater?=?act.getLayoutInflater();
rowView?=?inflater.inflate(R.layout.menu_listitem,?null);
MenuItem?viewHolder?=?new?MenuItem();
viewHolder.label?=?(TextView)?rowView.findViewById(R.id.menu_label);
viewHolder.icon?=?(ImageView)?rowView.findViewById(R.id.menu_icon);
rowView.setTag(viewHolder);
}
MenuItem?holder?=?(MenuItem)?rowView.getTag();
String?s?=?items[position].label;
holder.label.setText(s);
holder.icon.setImageResource(items[position].icon);
return?rowView;
}}private?static?boolean?menuShown?=?false;private?static?View?menu;private?static?LinearLayout?content;private?static?FrameLayout?parent;private?static?int?menuSize;private?static?int?statusHeight?=?0;private?Activity?act;SlideMenu(Activity?act)?{
this.act?=?act;}//call?this?in?your?onCreate()?for?screen?rotationpublic?void?checkEnabled()?{
if(menuShown)
this.show(false);}public?void?show()?{//get?the?height?of?the?status?bar
if(statusHeight?==?0)?{
Rect?rectgle?=?new?Rect();
Window?window?=?act.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
statusHeight?=?rectgle.top;
}
this.show(true);}public?void?show(boolean?animate)?{
menuSize?=?Functions.dpToPx(250,?act);
content?=?((LinearLayout)?act.findViewById(android.R.id.content).getParent());
FrameLayout.LayoutParams?parm?=?(FrameLayout.LayoutParams)?content.getLayoutParams();
parm.setMargins(menuSize,?0,?-menuSize,?0);
content.setLayoutParams(parm);//animation?for?smooth?slide-out
TranslateAnimation?ta?=?new?TranslateAnimation(-menuSize,?0,?0,?0);
ta.setDuration(500);
if(animate)
content.startAnimation(ta);
parent?=?(FrameLayout)?content.getParent();
LayoutInflater?inflater?=?(LayoutInflater)?act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
menu?=?inflater.inflate(R.layout.menu,?null);
FrameLayout.LayoutParams?lays?=?new?FrameLayout.LayoutParams(-1,?-1,?3);
lays.setMargins(0,statusHeight,?0,?0);
menu.setLayoutParams(lays);
parent.addView(menu);
ListView?list?=?(ListView)?act.findViewById(R.id.menu_listview);
list.setOnItemClickListener(new?OnItemClickListener()?{
@Override
public?void?onItemClick(AdapterView>?parent,?View?view,?int?position,?long?id)?{
//handle?your?menu-click
}
});
if(animate)
menu.startAnimation(ta);
menu.findViewById(R.id.overlay).setOnClickListener(new?OnClickListener()?{
@Override
public?void?onClick(View?v)?{
SlideMenu.this.hide();
}
});
Functions.enableDisableViewGroup((LinearLayout)?parent.findViewById(android.R.id.content).getParent(),?false);
((ExtendedViewPager)?act.findViewById(R.id.viewpager)).setPagingEnabled(false);
((ExtendedPagerTabStrip)?act.findViewById(R.id.viewpager_tabs)).setNavEnabled(false);
menuShown?=?true;
this.fill();}public?void?fill()?{
ListView?list?=?(ListView)?act.findViewById(R.id.menu_listview);
SlideMenuAdapter.MenuDesc[]?items?=?new?SlideMenuAdapter.MenuDesc[5];
//fill?the?menu-items?here
SlideMenuAdapter?adap?=?new?SlideMenuAdapter(act,?items);
list.setAdapter(adap);}public?void?hide()?{
TranslateAnimation?ta?=?new?TranslateAnimation(0,?-menuSize,?0,?0);
ta.setDuration(500);
menu.startAnimation(ta);
parent.removeView(menu);
TranslateAnimation?tra?=?new?TranslateAnimation(menuSize,?0,?0,?0);
tra.setDuration(500);
content.startAnimation(tra);
FrameLayout.LayoutParams?parm?=?(FrameLayout.LayoutParams)?content.getLayoutParams();
parm.setMargins(0,?0,?0,?0);
content.setLayoutParams(parm);
Functions.enableDisableViewGroup((LinearLayout)?parent.findViewById(android.R.id.content).getParent(),?true);
((ExtendedViewPager)?act.findViewById(R.id.viewpager)).setPagingEnabled(true);
((ExtendedPagerTabStrip)?act.findViewById(R.id.viewpager_tabs)).setNavEnabled(true);
menuShown?=?false;}}
一些幫助方法(對我來說,在靜態Functions.java中):public?static?int?dpToPx(int?dp,?Context?ctx)?{
Resources?r?=?ctx.getResources();
return?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,?dp,?r.getDisplayMetrics());}//originally:?http://stackoverflow.com/questions/5418510/disable-the-touch-events-for-all-the-views//modified?for?the?needs?herepublic?static?void?enableDisableViewGroup(ViewGroup?viewGroup,?boolean?enabled)?{
int?childCount?=?viewGroup.getChildCount();
for?(int?i?=?0;?i?
View?view?=?viewGroup.getChildAt(i);
if(view.isFocusable())
view.setEnabled(enabled);
if?(view?instanceof?ViewGroup)?{
enableDisableViewGroup((ViewGroup)?view,?enabled);
}?else?if?(view?instanceof?ListView)?{
if(view.isFocusable())
view.setEnabled(enabled);
ListView?listView?=?(ListView)?view;
int?listChildCount?=?listView.getChildCount();
for?(int?j?=?0;?j?
if(view.isFocusable())
listView.getChildAt(j).setEnabled(false);
}
}
}
}
然后,布局:
菜單布局(res / layout / menu.xml)
android:layout_width="fill_parent"
android:layout_height="fill_parent"?>
android:orientation="vertical"
android:layout_height="fill_parent"
android:layout_width="250dip"
android:background="@color/darkblack">
android:id="@+id/menu_listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@color/dividerblack"
android:dividerHeight="2dip"??/>
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"?>
listitems的布局(res / layout / menu_listitem.xml):
android:id="@+id/menu_icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="5dip"
android:layout_marginLeft="10dip"
android:layout_marginTop="10dip"
android:layout_marginBottom="10dip"?/>
android:id="@+id/menu_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="24dp"
android:layout_marginTop="10dip"
android:layout_marginBottom="10dip"?/>
如何使用它:
在你的onCreate():private?SlideMenu?slidemenu;@Overridepublic?void?onCreate(Bundle?savedInstanceState)?{
//your?onCreate?code
slidemenu?=?new?SlideMenu(this);
slidemenu.checkEnabled();}
在ActionBar homebutton的處理程序中:slidemenu.show();
而已!
現在,它的一些屏幕截圖:
據我所知,它正在發揮作用。如果您遇到任何問題或我的解釋不明確,請與我聯系!
編輯:ExtendedViewPager&ExtendedPagerStrip:
ExtendedViewPager:package?your.cool.app;//source:?http://blog.svpino.com/2011/08/disabling-pagingswiping-on-android.htmlimport?android.content.Context;import?android.support.v4.view.ViewPager;import?android.util.AttributeSet;import?android.view.MotionEvent;public?class?ExtendedViewPager?extends?ViewPager?{private?boolean?enabled;public?ExtendedViewPager(Context?context,?AttributeSet?attrs)?{
super(context,?attrs);
this.enabled?=?true;}@Overridepublic?boolean?onTouchEvent(MotionEvent?event)?{
if?(this.enabled)?{
return?super.onTouchEvent(event);
}
return?false;}@Overridepublic?boolean?onInterceptTouchEvent(MotionEvent?event)?{
if?(this.enabled)?{
return?super.onInterceptTouchEvent(event);
}
return?false;}public?void?setPagingEnabled(boolean?enabled)?{
this.enabled?=?enabled;}}
ExtendedPagerTabStrip:package?your.cool.app;//source:?http://blog.svpino.com/2011/08/disabling-pagingswiping-on-android.htmlimport?android.content.Context;import?android.support.v4.view.PagerTabStrip;import?android.util.AttributeSet;import?android.view.MotionEvent;public?class?ExtendedPagerTabStrip?extends?PagerTabStrip?{private?boolean?enabled;public?ExtendedPagerTabStrip(Context?context,?AttributeSet?attrs)?{
super(context,?attrs);
this.enabled?=?true;}@Overridepublic?boolean?onTouchEvent(MotionEvent?event)?{
if?(this.enabled)?{
return?super.onTouchEvent(event);
}
return?false;}@Overridepublic?boolean?onInterceptTouchEvent(MotionEvent?event)?{
if?(this.enabled)?{
return?super.onInterceptTouchEvent(event);
}
return?false;}public?void?setNavEnabled(boolean?enabled)?{
this.enabled?=?enabled;}}
我將它SlideMenu用于一個ViewPager帶有PagerTabStripfor,如Talk,Market等標簽的Activity?。你不能以一種簡單的方式禁用這些視圖,所以上面的兩個類只是擴展它們以onTouch在禁用時停止事件。
總結
以上是生活随笔為你收集整理的android防谷歌滑动效果,谷歌是如何做到这一点的?在Android应用程序中滑动ActionBar...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 七号信令的消息结构(包括SCCP详解)
- 下一篇: 京瓷2211打印机清零_打印机墨粉盒清零