Android自定义控件6----继承ViewGroup自定义侧滑菜单

来源:互联网 发布:石狮优浮网络会所 编辑:程序博客网 时间:2024/05/02 01:54

效果图:


项目结构:


核心代码:

MainActivity中
package com.example.cehua;import android.app.Activity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ListView;import com.orhanobut.logger.Logger;import java.util.ArrayList;public class MainActivity extends Activity {    private ListView lvMain;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        myOnClick();    }    private void initView() {        lvMain = (ListView)findViewById(R.id.lvMain);//      拿到数据,并绑定数据        ArrayList<MyBean> list = myData();        Logger.t("111").d("list>>>"+list);        MyAdapter myAdapter = new MyAdapter(list,MainActivity.this);        lvMain.setAdapter(myAdapter);    }    private void myOnClick(){    }    private ArrayList<MyBean>myData(){        ArrayList<MyBean>list = new ArrayList<>();        for(int i = 0; i <100 ; i++) {            MyBean myBean = new MyBean("Content"+i);            list.add(myBean);        }        return list;    }}
SlideLayout
package com.example.cehua;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.FrameLayout;import android.widget.Scroller;import com.orhanobut.logger.Logger;/** * 作者:杨光福 on 2016/5/18 15:25 * 微信:yangguangfu520 * QQ号:541433511 * 作用:侧滑菜单item */public class SlideLayout extends FrameLayout {    private static final String TAG = SlideLayout.class.getSimpleName();    private View contentView;    private View menuView;    /**     * 滚动者     */    private Scroller scroller;    /**     * Content的宽     */    private int contentWidth;    private int menuWidth;    private int viewHeight;//他们的高都是相同的    public SlideLayout(Context context, AttributeSet attrs) {        super(context, attrs);        scroller = new Scroller(context);    }    /**     * 当布局文件加载完成的时候回调这个方法     */    @Override    protected void onFinishInflate() {        super.onFinishInflate();        contentView = getChildAt(0);        menuView = getChildAt(1);    }    /**     * 在测量方法里,得到各个控件的高和宽     *     * @param widthMeasureSpec     * @param heightMeasureSpec     */    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);//      内容的宽        contentWidth = contentView.getMeasuredWidth();//      删除按钮的宽        menuWidth = menuView.getMeasuredWidth();//      控件高度都一样        viewHeight = getMeasuredHeight();    }    @Override    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {        super.onLayout(changed, left, top, right, bottom);        //指定菜单的位置,删除按钮的4个坐标,左,上,右,下(左上角的点,右下角的点)        menuView.layout(contentWidth, 0, contentWidth + menuWidth, viewHeight);    }    private float startX;    private float startY;    private float downX;//只赋值一次    private float downY;    @Override    public boolean onTouchEvent(MotionEvent event) {        super.onTouchEvent(event);        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                //1.按下记录坐标                downX = startX = event.getX();                downY = startY = event.getY();                Log.e(TAG,"SlideLayout-onTouchEvent-ACTION_DOWN");                break;            case MotionEvent.ACTION_MOVE:                Log.e(TAG,"SlideLayout-onTouchEvent-ACTION_MOVE");                //2.记录结束值                float endX = event.getX();                float endY = event.getY();                //3.计算偏移量                float distanceX = endX - startX;                int toScrollX= (int) (getScrollX()-distanceX);                Logger.t("111").d("getScrollX>>>"+getScrollX()+"distanceX>>>"+distanceX+"toScrollX>>>"+toScrollX);//              设置移动范围                if(toScrollX<0) {                    toScrollX=0;                }else if(toScrollX>menuWidth) {                    toScrollX=menuWidth;                }//              整体滑动,横向滑动偏移量,纵向偏移量是0                scrollTo(toScrollX,0);                //在X轴和Y轴滑动的距离                float DX = Math.abs(endX-downX);                float DY = Math.abs(endY-downY);                if(DX > DY&&DX>8){                    //水平方向滑动                    //响应侧滑                    //反拦截-事件给SlideLayout,就是listView不对事件做拦截处理,把事件传给SlideLayout                    getParent().requestDisallowInterceptTouchEvent(true);                }                break;            case MotionEvent.ACTION_UP:                Log.e(TAG,"SlideLayout-onTouchEvent-ACTION_UP");//              整体偏移量                int totalScrollX = getScrollX();                if(totalScrollX < menuWidth/2){                    //关闭Menu                    closeMenu();                }else{                    //打开Menu                    openMenu();                }                break;        }        return true;    }    /**     * 事件拦截     * true:拦截孩子的事件,但会执行当前控件的onTouchEvent()方法     * false:不拦截孩子的事件,事件继续传递     * @param event     * @return     */    @Override    public boolean onInterceptTouchEvent(MotionEvent event) {        boolean intercept = false;        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                //1.按下记录坐标                downX = startX = event.getX();                Log.e(TAG,"SlideLayout-onTouchEvent-ACTION_DOWN");                if(onStateChangeListenter != null){                    onStateChangeListenter.onDown(this);                }                break;            case MotionEvent.ACTION_MOVE:                Log.e(TAG,"SlideLayout-onTouchEvent-ACTION_MOVE");                //2.记录结束值                float endX = event.getX();                float endY = event.getY();                //3.计算偏移量                float distanceX = endX - startX;                startX = event.getX();                //在X轴和Y轴滑动的距离                float DX = Math.abs(endX-downX);                if(DX>8){                    intercept = true;                }                break;            case MotionEvent.ACTION_UP:                break;        }        return intercept;    }    /**     * 打开menu     */    public void openMenu() {        //--->menuWidth        int distanceX = menuWidth - getScrollX();        scroller.startScroll(getScrollX(), getScrollY(), distanceX, getScrollY());        invalidate();//强制刷新 调computeScroll()和onDraw()        if(onStateChangeListenter != null){            onStateChangeListenter.onOpen(this);        }    }    /**     * 关闭menu     */    public void closeMenu() {        //--->0        int distanceX = 0 - getScrollX();        scroller.startScroll(getScrollX(), getScrollY(), distanceX, getScrollY());        invalidate();//强制刷新 调computeScroll()和onDraw()        if(onStateChangeListenter != null){            onStateChangeListenter.onClose(this);        }    }    @Override    public void computeScroll() {        super.computeScroll();        if(scroller.computeScrollOffset()){            scrollTo(scroller.getCurrX(),scroller.getCurrY());            invalidate();        }    }    /**     * 监听SlideLayout状态的改变     */    public interface OnStateChangeListenter{        void onClose(SlideLayout layout);        void onDown(SlideLayout layout);        void onOpen(SlideLayout layout);    }    private  OnStateChangeListenter onStateChangeListenter;    /**     * 设置SlideLayout状态的监听     * @param onStateChangeListenter     */    public void setOnStateChangeListenter(OnStateChangeListenter onStateChangeListenter) {        this.onStateChangeListenter = onStateChangeListenter;    }}
MyAdapter
package com.example.cehua;import android.content.Context;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;/** * Created by 16838 on 2017/11/3. */public class MyAdapter extends BaseAdapter{    private SlideLayout slideLayoutooo;    private Context context;    private ArrayList<MyBean> list;    public MyAdapter(ArrayList<MyBean> list,Context context){        this.context = context;        this.list = list;    }    @Override    public int getCount() {        return list.size();    }    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        ViewHolder viewHolder = null;        if(convertView==null) {            convertView=View.inflate(context,R.layout.item_main,null);            viewHolder = new ViewHolder();            viewHolder.item_menu = (TextView) convertView.findViewById(R.id.item_menu);            viewHolder.item_content = (TextView) convertView.findViewById(R.id.item_content);            convertView.setTag(viewHolder);        }else{            viewHolder= (ViewHolder) convertView.getTag();        }        //根据位置得到内容        final MyBean myBean = list.get(position);        viewHolder.item_content.setText(myBean.getName());//      内容按钮        viewHolder.item_content.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                MyBean myBean1 = list.get(position);                Toast.makeText(context, myBean1.getName(), Toast.LENGTH_SHORT).show();            }        });//      删除按钮        viewHolder.item_menu.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                SlideLayout slideLayout = (SlideLayout) v.getParent();                slideLayout.closeMenu();                list.remove(myBean);                notifyDataSetChanged();            }        });//      拿到父控件监听状态变化        SlideLayout slideLayout = (SlideLayout) convertView;        slideLayout.setOnStateChangeListenter(new SlideLayout.OnStateChangeListenter() {            @Override            public void onClose(SlideLayout layout) {                if(slideLayoutooo ==layout){                    slideLayoutooo = null;                }            }            @Override            public void onDown(SlideLayout layout) {                if(slideLayoutooo != null && slideLayoutooo!=layout){                    slideLayoutooo.closeMenu();                }            }            @Override            public void onOpen(SlideLayout layout) {                slideLayoutooo = layout;            }        });        return convertView;    }    static class ViewHolder{        TextView item_menu;        TextView item_content;    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }}
MyBean
package com.example.cehua;/** * 作者:杨光福 on 2016/5/18 15:54 * 微信:yangguangfu520 * QQ号:541433511 */public class MyBean {    private String name;    public MyBean(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.atguigu.slidemenu.MainActivity">    <ListView        android:id="@+id/lvMain"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>
item_content.xml
<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="60dp"    android:background="#44000000"    android:gravity="center"    android:text="Content"    android:textColor="#000000"    android:textSize="25sp"></TextView>
item_main.xml
<?xml version="1.0" encoding="utf-8"?><com.example.cehua.SlideLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="60dp">    <include android:id="@+id/item_content" layout="@layout/item_content"/>    <include android:id="@+id/item_menu" layout="@layout/item_menu"/></com.example.cehua.SlideLayout>
item_menu.xml
<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="60dp"    android:background="#22000000"    android:gravity="center"    android:text="Delete"    android:textColor="#ff0000"    android:textSize="25sp"></TextView>

源码下载:

Myself ---- cehua1

http://download.csdn.net/download/zhaihaohao1/10111351

参考视频:

http://www.gulixueyuan.com/course/124/learn#lesson/1928

阅读全文
0 0