91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Android項目中使用View實現一個側滑菜單

發布時間:2020-11-23 17:38:03 來源:億速云 閱讀:131 作者:Leah 欄目:移動開發

在Android項目中使用View實現一個側滑菜單?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、概述

  在App中,經常會出現側滑菜單,側滑滑出View等效果,雖然說Android有很多第三方開源庫,但是實際上咱們可以自己也寫一個自定義的側滑View控件,其實不難,主要涉及到以下幾個要點:

1.對Android中Window類中的DecorView有所了解

2.對Scroller類實現平滑移動效果

3.自定義ViewGroup的實現

首先來看看效果圖吧:

在Android項目中使用View實現一個側滑菜單

在Android項目中使用View實現一個側滑菜單   在Android項目中使用View實現一個側滑菜單  

  下面現在就來說說這里咱們實現側滑View的基本思路吧,這里我采用的是自定義一個繼承于RelativeLayout的控件叫做XCSlideView類吧。

首先從布局文件中inflater出來一個menuView,然后通過addView的方法,將該側滑View添加到自定義的控件View中怎么讓XCSlideView 這個側滑View 隱藏到屏幕之外呢?很簡單通過ScrollTo方法,移動一個屏幕寬度的距離即可,這里以左側滑出為例吧,只需要這樣 XCSlideView.this.scrollTo(mScreenWidth, 0);mScreenWidth是屏幕寬度。下面還要處理的就是底下的半透明黑色的蒙層效果,這個其實就是一個View,然后設置半透明效果。這個當然簡單了,關鍵是咱們讓他顯示在咱們的自定義側滑View的下面呢,這里咱們先給出DecorView的簡單分析,方便下面介紹添加半透明View蒙層下:

在Android項目中使用View實現一個側滑菜單

下面是對上面這張圖的解釋:

1、DecorView為整個Window界面的最頂層View。

2、DecorView只有一個子元素為LinearLayout。代表整個Window界面,包含通知欄,標題欄,內容顯示欄三塊區域。

3、LinearLayout里有兩個FrameLayout子元素。

  (20)為標題欄顯示界面。只有一個TextView顯示應用的名稱。也可以自定義標題欄,載入后的自定義標題欄View將加入FrameLayout中。

  (21)為內容欄顯示界面。就是setContentView()方法載入的布局界面,加入其中。 

有了上面的DecorVIew知識背景,現在就來說說 怎么添加蒙層View和將自定義側滑View添加到Activity的DecorView中,首先把蒙層View添加到

(31)customView中去,然后將自定義側滑View添加到 (21)FrameLayout中去,至于為什么要這樣,是因為考慮到自定義側滑View不一定是寬度為屏幕寬度,所以才這么做,而且也方面處理有無標題欄,有無采用沉浸式狀態欄設計等情況。

二、自定義側滑View的實現

根據上面的概述,大家應該知道大概的思路了,下面我就給出自定義側滑View類的核心代碼:

1、自定義側滑View用到的變量:

//側滑方向-從哪側滑出
 public static enum Positon {
 LEFT, RIGHT
 }
 private Context mContext;
 private Activity mActivity;
 private Scroller mScroller = null;
 //側滑菜單布局View
 private View mMenuView;
 //底部蒙層View
 private View mMaskView;
 private int mMenuWidth = 0;
 //屏幕寬度
 private int mScreenWidth = 0;
 //是否在滑動中
 private boolean mIsMoving = false;
 //顯示登錄界面與否
 private boolean mShow = false;
 //滑動動畫時間
 private int mDuration = 600;
 //缺省側滑方向為左
 private Positon mPositon = Positon.LEFT;

2、初始化創建自定義側滑View:

**
 * 創建側滑菜單View
 */
 public static XCSlideView create(Activity activity) {
 XCSlideView view = new XCSlideView(activity);
 return view;
 }
 /**
 * 創建側滑菜單View
 */
 public static XCSlideView create(Activity activity, Positon positon) {
 XCSlideView view = new XCSlideView(activity);
 view.mPositon = positon;
 return view;
 }

3、創建半透明蒙層View,并添加到contentView中去

/**
 * 創建 蒙層View并添加到contentView中
 */
 private void attachToContentView(Activity activity, Positon positon) {
 mPositon = positon;
 ViewGroup contentFrameLayout = (ViewGroup) activity.findViewById(android.R.id.content);
 ViewGroup contentView = ((ViewGroup) contentFrameLayout.getChildAt(0));
 mMaskView = new View(activity);
 mMaskView.setBackgroundColor(mContext.getResources().getColor(R.color.mask_color));
 contentView.addView(mMaskView, contentView.getLayoutParams());
 mMaskView.setVisibility(View.GONE);
 mMaskView.setClickable(true);
 mMaskView.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View view) {
 if (isShow()) {
  dismiss();
 }
 }
 });
 }

4、設置側滑菜單View,并添加到DectorView->LinearLayout->內容顯示區域View(FrameLayout)中

/**
 * 設置側滑菜單View,并添加到DectorView->LinearLayout->內容顯示區域View中
 */
 public void setMenuView(Activity activity, View view) {
 mActivity = activity;
 mMenuView = view;
 LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
 addView(mMenuView, params);
 mMenuView.post(new Runnable() {
 @Override
 public void run() {
 // TODO Auto-generated method stub
 mMenuWidth = mMenuView.getWidth();
 switch (mPositon) {
  case LEFT:
  XCSlideView.this.scrollTo(mScreenWidth, 0);
  break;
  case RIGHT:
  XCSlideView.this.scrollTo(-mScreenWidth, 0);
  break;
 }

 }
 });
 ViewGroup contentFrameLayout = (ViewGroup) activity.findViewById(android.R.id.content);
 ViewGroup contentView = contentFrameLayout;
 contentView.addView(this);
 FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) this.getLayoutParams();
 switch (mPositon) {
 case LEFT:
 layoutParams.gravity = Gravity.LEFT;
 layoutParams.leftMargin = 0;
 break;
 case RIGHT:
 layoutParams.gravity = Gravity.RIGHT;
 layoutParams.rightMargin = 0;
 break;
 }
 TextView titleFrameLayout = (TextView) activity.findViewById(android.R.id.title);
 if( titleFrameLayout != null){
 layoutParams.topMargin = DensityUtil.getStatusBarHeight(mContext);
 }
 int flags = mActivity.getWindow().getAttributes().flags;
 int flag = (flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
 if(flag == WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS){
 //說明狀態欄使用沉浸式
 layoutParams.topMargin = DensityUtil.getStatusBarHeight(mContext);
 }
 this.setLayoutParams(layoutParams);
 }

5、處理自定義側滑View的側滑滑動和隱藏效果:

/**
 * 顯示側滑菜單View
 */
 public void show(){
 if(isShow() && !mIsMoving)
 return;
 switch (mPositon) {
 case LEFT:
 startScroll(mMenuWidth, -mMenuWidth, mDuration);
 break;
 case RIGHT:
 startScroll(-mMenuWidth, mMenuWidth, mDuration);
 break;
 }
 switchMaskView(true);
 mShow = true;
 }
 /**
 * 蒙層顯示開關
 */
 private void switchMaskView(boolean bShow){
 if(bShow){
 mMaskView.setVisibility(View.VISIBLE);
 Animation animation = new AlphaAnimation(0.0f, 1.0f);
 animation.setDuration(mDuration);
 mMaskView.startAnimation(animation);
 }else{
 mMaskView.setVisibility(View.GONE);
 }
 }
 /**
 * 關閉側滑菜單View
 */
 public void dismiss() {
 // TODO Auto-generated method stub
 if(!isShow() && !mIsMoving)
 return;
 switch (mPositon) {
 case LEFT:
 startScroll(XCSlideView.this.getScrollX(), mMenuWidth, mDuration);
 break;
 case RIGHT:
 startScroll(XCSlideView.this.getScrollX(), -mMenuWidth, mDuration);
 break;
 }
 switchMaskView(false);
 mShow = false;
 }
 public boolean isShow(){
 return mShow;
 }
 @Override
 public void computeScroll() {
 // TODO Auto-generated method stub
 if (mScroller.computeScrollOffset()) {
 scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
 // 更新界面
 postInvalidate();
 mIsMoving = true; 
 } else {
 mIsMoving = false;
 }
 super.computeScroll();
 }
 /**
 * 拖動移動
 */
 public void startScroll(int startX, int dx,int duration){
 mIsMoving = true;
 mScroller.startScroll(startX,0,dx,0,duration);
 invalidate();
 }

三、如何使用該自定義側滑View控件

使用起來,比較簡單,通過create方法創建一個側滑VIew,然后通過setMenuView方法設置一個側滑View進去,有需要設置寬度的話, 通過setMenuWidth方法來設置即可,最后用show()方法滑出來就可以啦,使用起來是不是很方便?

private XCSlideView mSlideViewLeft;
//屏幕寬度
private int mScreenWidth = 0;
View menuViewLeft = LayoutInflater.from(mContext).inflate(R.layout.layout_slideview,null);
mSlideViewLeft = XCSlideView.create(this, XCSlideView.Positon.LEFT);
mSlideViewLeft.setMenuView(MainActivity.this, menuViewLeft);
mSlideViewLeft.setMenuWidth(mScreenWidth * 7 / 9);
Button left = (Button)findViewById(R.id.btn_left);
 left.setOnClickListener(new View.OnClickListener() {

 @Override
 public void onClick(View v) {
 // TODO Auto-generated method stub
 if (!mSlideViewLeft.isShow())
  mSlideViewLeft.show();
 }
 });

看完上述內容,你們掌握在Android項目中使用View實現一個側滑菜單的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梧州市| 平原县| 澳门| 阆中市| 米脂县| 武宣县| 青神县| 葫芦岛市| 咸丰县| 内丘县| 武鸣县| 湖州市| 叶城县| 平潭县| 开江县| 枣强县| 许昌县| 清远市| 永寿县| 江华| 武邑县| 金寨县| 鄢陵县| 兴国县| 堆龙德庆县| 河北省| 长春市| 喀什市| 定日县| 乡城县| 莒南县| 朝阳市| 巴彦淖尔市| 太仆寺旗| 三门县| 苏尼特右旗| 汤原县| 剑河县| 莆田市| 信阳市| 星座|