android自定义控件 侧滑菜单

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值