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
- Android自定义控件6----继承ViewGroup自定义侧滑菜单
- android自定义ViewGroup(侧滑菜单)
- 自定义viewgroup 继承 FrameLayout 仿QQ侧滑菜单
- Android自定义控件-完全自定义(继承View ,ViewGroup)
- Android 自定义ViewGroup控件
- Android自定义控件 -- 自定义ViewGroup
- Android继承自View和ViewGroup,自定义控件
- 探究Android中通过继承ViewGroup自定义控件的原理
- 探究Android中通过继承ViewGroup自定义控件的原理
- Android自定义控件之继承ViewGroup创建新容器
- Android 自定义控件之继承ViewGroup创建新容器
- 自定义ViewGroup实现侧滑删除菜单
- Android 自定义侧滑ViewGroup
- Android:自定义侧滑菜单控件
- android自定义控件 侧滑菜单
- Android自定义控件3----继承ViewGroup自定义和系统一样的ViewPager
- android控件-自定义菜单
- android 自定义菜单控件
- 如何将自己的代码上传到GitHub托管
- (算法分析Week9)Regular Expression Matching[Hard]
- 操作系统概念第6章题目
- 老码农看到的技术债务
- 递归练习
- Android自定义控件6----继承ViewGroup自定义侧滑菜单
- Springboot启动报错:Your ApplicationContext is unlikely to start due to a @ComponentScan of the default
- Linux——网络编程基础(二)
- 并发编程(8)-单例和多线程
- LeetCode基础-图
- Linux shell:使用AWK产生随机数/随机字符串
- 模糊查询
- Java实现excel的读与写(Apache POI)
- magento 开发 -- 入门深入理解第七章 – 自定义Magento系统配置