android自定义控件 侧滑菜单

来源:互联网 发布:海关数据销售 编辑:程序博客网 时间:2024/05/22 14:10
package com.example111.sxy.a08;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {    private ListView lv_main;    private ArrayList<MyBeans> myBeans;    private MyAdapter myAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lv_main = (ListView) findViewById(R.id.lv_main);        myBeans = new ArrayList<>();        for (int i = 0;i<100;i++){            myBeans.add(new MyBeans("content"+i));        }        myAdapter = new MyAdapter();        lv_main.setAdapter(myAdapter);    }    static class ViewHolder{        TextView item_context;        TextView item_menu;    }    class MyAdapter extends BaseAdapter{        @Override        public int getCount() {            return myBeans.size();        }        @Override        public Object getItem(int position) {            return null;        }        @Override        public long getItemId(int position) {            return 0;        }        @Override        public View getView(final int position, View convertView, ViewGroup parent) {            ViewHolder viewHolder;            if(convertView == null) {                convertView = View.inflate(MainActivity.this,R.layout.item_main,null);                viewHolder = new ViewHolder();                viewHolder.item_context = (TextView) convertView.findViewById(R.id.item_context);                viewHolder.item_menu = (TextView) convertView.findViewById(R.id.item_menu);                convertView.setTag(viewHolder);            }else {                viewHolder = (ViewHolder) convertView.getTag();            }             final MyBeans myBean = myBeans.get(position);            viewHolder.item_context.setText(myBean.getName());            viewHolder.item_context.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    MyBeans m = myBeans.get(position);                    Toast.makeText(MainActivity.this,m.getName(),Toast.LENGTH_LONG).show();                }            });            viewHolder.item_menu.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    SlideLayout slidelayout = (SlideLayout) v.getParent();                    slidelayout.closeMenu();                    myBeans.remove(myBean);                    notifyDataSetChanged();                }            });            SlideLayout slideLayout = (SlideLayout) convertView;            slideLayout.setOnStateChangeListenter(new MyOnStateChangeListenter());            return convertView;        }    }    private SlideLayout slideLayout;    class MyOnStateChangeListenter implements SlideLayout.OnStateChangeListenter{        @Override        public void onClose(SlideLayout layout) {            if(slideLayout == layout) {                slideLayout = null;            }        }        @Override        public void onDown(SlideLayout layout) {            if(slideLayout != null && slideLayout != layout) {                slideLayout.closeMenu();            }        }        @Override        public void onOpen(SlideLayout layout) {            slideLayout = layout;        }    }}
package com.example111.sxy.a08;/** * Created by sxy on 2017/10/26. */public class MyBeans {    private String name;    @Override    public String toString() {        return "MyBeans{" +                "name='" + name + '\'' +                '}';    }    public MyBeans(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
package com.example111.sxy.a08;import android.content.Context;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.FrameLayout;import android.widget.Scroller;/** * Created by sxy on 2017/10/26. */public class SlideLayout extends FrameLayout {    private int contextWidth;    private int menuWidth;    private int contextheight;    private View contextView;    private View menuView;    private Scroller scroller;    public SlideLayout(@NonNull Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        scroller = new Scroller(context);    }    @Override    protected void onFinishInflate() {        super.onFinishInflate();        contextView = getChildAt(0);        menuView = getChildAt(1);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        contextWidth = contextView.getMeasuredWidth();        menuWidth = menuView.getMeasuredWidth();        contextheight = getMeasuredHeight();    }    @Override    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {        super.onLayout(changed, left, top, right, bottom);        menuView.layout(contextWidth,0,contextWidth+menuWidth,contextheight);    }    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:                downX= startx = event.getX();                downY=starty=event.getY();                break;            case MotionEvent.ACTION_MOVE:                float endy = event.getY();                float endx = event.getX();                float distenceX = endx-startx;                int sroX = (int) (getScrollX()-distenceX);                if(sroX<0) {                    sroX=0;                }else if(sroX>menuWidth) {                    sroX = menuWidth;                }                scrollTo(sroX,getScrollY());                float dx = Math.abs(endx-downX);                float dy = Math.abs(endy-downY);                if(dx>dy && dx>5) {                    getParent().requestDisallowInterceptTouchEvent(true);                }                startx = event.getX();                starty=event.getY();                break;            case MotionEvent.ACTION_UP:                int sx = getScrollX();                if(sx>menuWidth/2) {                    openMenu();                }else {                    closeMenu();                }                break;        }        return true;    }    public void closeMenu() {        int dx = 0-getScrollX();        scroller.startScroll(getScrollX(),getScrollY(),dx,getScrollY());        invalidate();        if(onStateChangeListenter != null) {            onStateChangeListenter.onClose(this);        }    }    public void openMenu() {        int dx = menuWidth-getScrollX();        scroller.startScroll(getScrollX(),getScrollY(),dx,getScrollY());        invalidate();        if(onStateChangeListenter != null) {            onStateChangeListenter.onOpen(this);        }    }    @Override    public void computeScroll() {        super.computeScroll();        if(scroller.computeScrollOffset()) {            scrollTo(scroller.getCurrX(),scroller.getCurrY());            invalidate();        }    }    @Override    public boolean onInterceptTouchEvent(MotionEvent event) {        boolean a = false;        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                downX= startx = event.getX();                downY=starty=event.getY();                if(onStateChangeListenter != null) {                    onStateChangeListenter.onDown(this);                }                break;            case MotionEvent.ACTION_MOVE:                float endy = event.getY();                float endx = event.getX();                float distenceX = endx-startx;                float dx = Math.abs(endx-downX);                float dy = Math.abs(endy-downY);                if(dx>8) {                    a = true;                }                break;            case MotionEvent.ACTION_UP:                break;        }        return a;    }    public interface OnStateChangeListenter{        void onClose(SlideLayout layout);        void onDown(SlideLayout layout);        void onOpen(SlideLayout layout);    }    private OnStateChangeListenter onStateChangeListenter;    public void setOnStateChangeListenter(OnStateChangeListenter onStateChangeListenter) {        this.onStateChangeListenter = onStateChangeListenter;    }}

<?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.example111.sxy.a08.MainActivity">    <ListView        android:id="@+id/lv_main"        android:layout_width="match_parent"        android:layout_height="match_parent"          /></RelativeLayout>
<?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:textColor="#000000"    android:text="context"    android:textSize="25sp"    android:gravity="center"></TextView>
<?xml version="1.0" encoding="utf-8"?><com.example111.sxy.a08.SlideLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="60dp">    <include android:id="@+id/item_context" layout="@layout/item_context"/>    <include android:id="@+id/item_menu" layout="@layout/item_menu"/></com.example111.sxy.a08.SlideLayout>

<?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:textColor="#ff0000"    android:text="Delete"    android:textSize="25sp"    android:gravity="center"></TextView>


阅读全文
0 0
原创粉丝点击