zoukankan      html  css  js  c++  java
  • android DrawerLayout 侧边栏实现

    现在实现侧边栏比较简单了,官方提供的DrawerLayout可以很方便实现。 
    主要实现方法是:用DrawerLayout 作为界面根控件。在DrawerLayout里面第一个View为当前界面主内容;第二个和第三个View为抽屉菜单内容。如果当前界面只需要一个抽屉菜单,则第三个View可以省略。 
    第一个View的宽高应当设置为match_parent 
    第二、三个View需要设置android:layout_gravity=”left”,和android:layout_gravity=”right”且一搬高度设置为match_parent,宽度为固定值,即侧滑菜单的宽度,宽度应该不超过320dp,这样用户可以在菜单打开的时候看到部分内容界面。如果需要监听菜单打开关闭事件,则需要调用 DrawerLayout类的setDrawerListener() 
    该接口提供了菜单打开关闭等事件的回调函数,例如 
    onDrawerOpened() 
    和 
    onDrawerClosed() 
    效果图: 
    这里写图片描述 
    描述一下:右侧滑出侧边栏,包括一个标题,一个车辆列表,点击列表,右侧滑出一个与侧边栏等宽的popupwindow,也包括标题与列表,点击popupwindow消失。主要有两点,第一是侧边栏,第二是popupwindow以及滑动动画 
    上代码: 
    主布局activity_favorite_car.xml

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/id_drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#f2f2f2">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <boerpower.com.boerchargingpile.UI.CustomTitles.TitleLayout
                android:id="@+id/id_titleLayot"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@mipmap/top">
    
            </boerpower.com.boerchargingpile.UI.CustomTitles.TitleLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:layout_marginTop="10dp"
                android:background="#ffffff"
                android:orientation="vertical">
    
                <ImageView
                    android:id="@+id/id_imageMyCar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginTop="88dp"
                    android:layout_marginBottom="88dp"
                    android:src="@mipmap/mycar_2" />
            </LinearLayout>
    
            <LinearLayout
                android:id="@+id/id_linearCarKind"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:background="@drawable/rect_white"
                android:padding="10dp"
                android:gravity="center">
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:textSize="14sp"
                    android:layout_weight="1"
                    android:text="@string/mycar_kind"
                    android:drawableLeft="@mipmap/mycar"
                    android:drawablePadding="10dp"
                    android:textColor="#3a3a3a"/>
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@mipmap/next_arrow"
                    />
            </LinearLayout>
        </LinearLayout>
    
    
        <LinearLayout
            android:id="@+id/id_right_menu"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="right"
            android:orientation="vertical">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:background="@mipmap/top"
                android:orientation="horizontal">
    
                <ImageView
                    android:id="@+id/id_imageUp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@mipmap/back"
                    android:layout_margin="12dp"/>
    
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:text="@string/mycar_favorite"
                    android:textColor="#ffffff"
                    android:textSize="17sp" />
            </LinearLayout>
    
            <ListView
                android:id="@+id/id_listView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#ffffff"
                android:cacheColorHint="#00000000"
                android:divider="#f2f2f2"
                android:dividerHeight="1dp"/>
        </LinearLayout>
    
    </android.support.v4.widget.DrawerLayout> 

    主界面代码

    //我的爱车
    public class FavoriteCarActivity extends BaseActivity implements TitleLayout.titleLayoutClick {
        private TitleLayout titleLayout;
        private ImageView imageViewCar;
        private LinearLayout linearLayoutCarKind;
        private LinearLayout linearLayoutRight;//右边栏
        private DrawerLayout mDrawerLayout;
        private ListView listViewCar;//车名称
        private ArrayList<String> carNameList = new ArrayList<>();//车名称
        private ArrayList<String> carModelList = new ArrayList<>();//车类型
        private PopupWindow popupWindow = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_favorite_car);
            titleLayout = (TitleLayout) findViewById(R.id.id_titleLayot);
            titleLayout.setTitle("我的爱车");
            imageViewCar = (ImageView) findViewById(R.id.id_imageMyCar);
            ImageView imageViewUp = (ImageView) findViewById(R.id.id_imageUp);
            linearLayoutCarKind = (LinearLayout) findViewById(R.id.id_linearCarKind);
            linearLayoutRight = (LinearLayout) findViewById(R.id.id_right_menu);
            linearLayoutCarKind.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    OpenRightMenu();
                }
            });
            mDrawerLayout = (DrawerLayout) findViewById(R.id.id_drawerLayout);
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
                    Gravity.RIGHT);
            listViewCar = (ListView) findViewById(R.id.id_listView);
            for (int i = 0; i < 10; i++) {
                carNameList.add("保时捷");
                carModelList.add("Panamera");
            }
    
            CarAdapter carAdapter = new CarAdapter();
            listViewCar.setAdapter(carAdapter);
            listViewCar.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    showCarModelPopupWindow();
                }
            });
            imageViewUp.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mDrawerLayout.closeDrawers();
                }
            });
        }
    
    
        public void OpenRightMenu() {
            mDrawerLayout.openDrawer(Gravity.RIGHT);
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,
                    Gravity.RIGHT);
        }
    
        private class CarAdapter extends BaseAdapter {
    
            public CarAdapter() {
    
            }
    
            @Override
            public int getCount() {
                return carNameList.size();
            }
    
            @Override
            public Object getItem(int position) {
                return position;
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
    
                if (convertView == null) {
                    convertView = LayoutInflater.from(FavoriteCarActivity.this).inflate(R.layout.car_name_item, null);
                }
    
                TextView textViewCarName = ViewHolder.get(convertView, R.id.id_textViewCar);
                textViewCarName.setText(carNameList.get(position));
    
    
                return convertView;
            }
    
        }
    
        @Override
        public void leftViewClick() {
            finish();
        }
    
        @Override
        public void rightViewClick() {
    
        }
    
    
        private void showCarModelPopupWindow() {
            View view = View.inflate(FavoriteCarActivity.this, R.layout.car_model_list, null);
            ImageView imageViewUp = (ImageView) view.findViewById(R.id.id_imageUp);
            TextView textViewTitle = (TextView) view.findViewById(R.id.id_textViewCarName);
            ListView listViewCarModel = (ListView) view.findViewById(R.id.id_listViewCarModel);
            popupWindow = new PopupWindow(view, linearLayoutRight.getWidth(),
                    LinearLayout.LayoutParams.MATCH_PARENT, true);
            popupWindow.setAnimationStyle(R.style.MenuAnimationLeftRight);
            popupWindow.setBackgroundDrawable(new BitmapDrawable());//需要设置背景,用物理键返回的时候
            popupWindow.setFocusable(true);
            popupWindow.setOutsideTouchable(true);  //设置点击屏幕其它地方弹出框消失
            CarModelAdapter carModelAdapter = new CarModelAdapter();
            listViewCarModel.setAdapter(carModelAdapter);
            listViewCarModel.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    popupWindow.dismiss();
                }
            });
            popupWindow.showAtLocation(titleLayout, Gravity.RIGHT, 0, 0);
            imageViewUp.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    popupWindow.dismiss();
                }
            });
        }
    
        private class CarModelAdapter extends BaseAdapter {
    
            public CarModelAdapter() {
    
            }
    
            @Override
            public int getCount() {
                return carModelList.size();
            }
    
            @Override
            public Object getItem(int position) {
                return position;
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
    
                if (convertView == null) {
                    convertView = LayoutInflater.from(FavoriteCarActivity.this).inflate(R.layout.car_model_item, null);
                }
    
                TextView textViewCarName = ViewHolder.get(convertView, R.id.id_textViewCarModel);
                textViewCarName.setText(carModelList.get(position));
    
    
                return convertView;
            }
    
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
                    mDrawerLayout.closeDrawers();
                } else {
                    return super.onKeyDown(keyCode, event);
                }
    
    
                return true;
            }
    
    
            return super.onKeyDown(keyCode, event);
        }
    }

    标题类TitleLayout.java

    /**
     * Created by dell on 2015/11/10.
     * 布局标题
     */
    public class TitleLayout extends RelativeLayout {
        TextView textViewContent;
        LinearLayout linearLeft;
        ImageView imageViewLeft;
        LinearLayout linearRight;
        ImageView imageViewRight;
        TextView textViewRight;
        private titleLayoutClick mListener;
    
        public TitleLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            LayoutInflater.from(context).inflate(R.layout.title, this);
            textViewContent = (TextView) findViewById(R.id.id_textviewContent);
            linearLeft = (LinearLayout) findViewById(R.id.id_linearLeft);
            imageViewLeft = (ImageView)findViewById(R.id.id_left);
            linearRight = (LinearLayout) findViewById(R.id.id_linearRight);
            imageViewRight = (ImageView)findViewById(R.id.id_right);
            textViewRight = (TextView) findViewById(R.id.id_rightText);
            try{
                mListener = (titleLayoutClick) context;
            }catch (Exception e){
                e.printStackTrace();
            }
    
            linearLeft.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener != null) {
                        mListener.leftViewClick();
                    }
                }
            });
            linearRight.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener != null) {
                        mListener.rightViewClick();
                    }
    
                }
            });
    
        }
    
        public void setTitle(String title) {
            textViewContent.setText(title);
        }
    
        //设置右边图片
        public void setLinearRightImage(int drawableID) {
            imageViewRight.setBackgroundResource(drawableID);
        }
        //设置左边图片
        public void setLinearLeftImage(int drawableID) {
            imageViewLeft.setBackgroundResource(drawableID);
        }
    
        //设置右边文本
        public void setLinearRightText(String rightTextString) {
            textViewRight.setText(rightTextString);
        }
    
        //设置右边图片为可见,根据viewID判断文本与图片的显示,0显示图片,1显示文本
        public void setLinearRightVisibility(int viewID) {
    
            linearRight.setVisibility(View.VISIBLE);
            if(viewID==0){
                imageViewRight.setVisibility(View.VISIBLE);
                textViewRight.setVisibility(View.INVISIBLE);
            }else if(viewID==1){
                textViewRight.setVisibility(View.VISIBLE);
                imageViewRight.setVisibility(View.INVISIBLE);
            }
        }
    
        public interface titleLayoutClick {
            public void leftViewClick();//左图片点击
            public void rightViewClick();//右边图片点击
        }
    }

    标题类布局title.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/id_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <LinearLayout
            android:id="@+id/id_linearLeft"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true">
    
            <ImageView
                android:id="@+id/id_left"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="12dp"
                android:background="@mipmap/back" />
    
        </LinearLayout>
    
        <LinearLayout
    
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true">
    
            <TextView
                android:id="@+id/id_textviewContent"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="12dp"
                android:textColor="@color/white"
                android:textSize="17sp"/>
    
        </LinearLayout>
    
    
        <LinearLayout
            android:id="@+id/id_linearRight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:visibility="invisible">
    
            <ImageView
                android:id="@+id/id_right"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="12dp" />
            <TextView
                android:id="@+id/id_rightText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="12dp"
                android:textSize="14sp"
                android:textColor="#ffffff"/>
        </LinearLayout>
    </RelativeLayout>

    列表项布局就不写了 
    动画style

     <!-- PopupWindow左右滑动的窗口动画 -->
        <style name="MenuAnimationLeftRight">
            <item name="android:windowEnterAnimation">@anim/menu_fadein_right</item>
            <item name="android:windowExitAnimation">@anim/menu_fadein_left</item>
        </style>

    menu_fadein_right

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <translate
            android:duration="500"
            android:fromXDelta="100%"
            android:toXDelta="0"
            />
    </set>

    menu_fadein_left

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:duration="500"
            android:fromXDelta="0"
            android:toXDelta="100%" />
    </set>

    参考博客 
    DrawerLayout 抽屉 
    Android DrawerLayout 高仿QQ5.2双向侧滑菜单

  • 相关阅读:
    java后端
    2017-12-11
    二叉树与分治法整理
    javaweb
    安装docker
    爬虫
    lintcode
    DEEPlearning
    剑指offer_by牛客网
    DFS
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5177442.html
Copyright © 2011-2022 走看看