android自定义控件实现左右划出菜单并添加点击事件
2016-02-19 23:52
519 查看
public class SwipeItemView extends View{public SwipeItemView(Context context){super(context);init();}public SwipeItemView(Context context, AttributeSet attrs){super(context, attrs);init();}public void setSwipeTxt(String leftTxt, String rightTxt){this.leftTxt = leftTxt;this.rightTxt = rightTxt;}@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)private void init(){m_Paint = new Paint(Paint.ANTI_ALIAS_FLAG);m_Paint.setDither(true);m_Paint.setTextSize(64);
//记录绘制试图的矩形
m_CRect = new RectF(0, 0, 0, 0);//中间矩形m_LRect = new RectF(0, 0, 0, 0);//左边矩形m_RRect = new RectF(0, 0, 0, 0);//右边矩形m_TWRect = new Rect(0, 0, 0, 0);//记录文字宽高的矩形setBackgroundColor(getResources().getColor(android.R.color.holo_green_dark));}@Overridepublic boolean onTouchEvent(MotionEvent event){switch (event.getAction() & event.getActionMasked()){case MotionEvent.ACTION_DOWN:m_ActDownPX = event.getX();float y = event.getY();if (Math.abs(m_Offset) == .5f * getWidth()){if (!(y > 0 && y < getHeight())) break;if (m_ActDownPX > 0 && m_ActDownPX < .5f * getWidth() && m_Offset > 0){ //点击左侧菜单,增加一个该view到父容器int w = SwipeItemView.this.getWidth();int h = SwipeItemView.this.getHeight();if (!(getParent() instanceof LinearLayout)) break;LinearLayout.LayoutParams lp1 = (LinearLayout.LayoutParams) SwipeItemView.this.getLayoutParams();LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(w, h);lp.setMargins(0, lp1.topMargin, 0, 0);LinearLayout ll = (LinearLayout) SwipeItemView.this.getParent();SwipeItemView view = new SwipeItemView(getContext());view.setLayoutParams(lp);ll.addView(view, ll.getChildC4000ount() - 1);}if (m_ActDownPX > .5f * getWidth() && m_ActDownPX < getWidth() && m_Offset < 0){ //点击右侧菜单,从父容器中删除该viewViewGroup ll = (ViewGroup) SwipeItemView.this.getParent();ll.removeView(SwipeItemView.this);}}break;case MotionEvent.ACTION_MOVE: //计算触摸滑动的偏移量m_Lock.lock();if (Math.abs(m_Offset + event.getX() - m_ActDownPX) <= .5f * getWidth()){m_Offset += event.getX() - m_ActDownPX;m_ActDownPX = event.getX();postInvalidate();}m_Lock.unlock();break;case MotionEvent.ACTION_UP:if (m_Offset == 0) break;if (m_Animation != null)//设置停止触摸后的偏移动画,偏移到指定位置。{m_Animation.cancel();m_Animation = null;}if (Math.abs(m_Offset) <= .2f * getWidth()){m_Animation = new Animation(){float offset = m_Offset;@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t){m_Offset = offset * (1 - interpolatedTime);postInvalidate();//重绘}};m_Animation.setDuration(120);startAnimation(m_Animation);} else{if (m_Offset > 0){m_Animation = new Animation(){float offset = m_Offset;float gap = .5f * getWidth() - m_Offset;@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t){m_Offset = offset + gap * interpolatedTime;postInvalidate();}};m_Animation.setDuration(120);startAnimation(m_Animation);} else{m_Animation = new Animation(){float offset = m_Offset;float gap = -.5f * getWidth() - m_Offset;@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t){m_Offset = offset + gap * interpolatedTime;postInvalidate();}};m_Animation.setDuration(120);startAnimation(m_Animation);}}break;default:break;}return true;}@Overrideprotected void onDraw(Canvas c){super.onDraw(c);m_Lock.lock();m_CRect.set(m_Offset, 0, getWidth() + m_Offset, getHeight());Paint.FontMetricsInt fmi = m_Paint.getFontMetricsInt();float baseLine = m_CRect.top + ((m_CRect.bottom - m_CRect.top) - (fmi.bottom - fmi.top)) / 2f - fmi.top;m_Paint.setTextAlign(Paint.Align.CENTER);//center textm_Paint.setColor(Color.BLACK);c.drawText("SwipeItemView", m_CRect.centerX(), baseLine, m_Paint);if (m_Offset > 0){//left textm_Paint.setColor(Color.DKGRAY);m_LRect.set(0, 0, m_Offset, getHeight());c.drawRect(m_LRect, m_Paint);m_Paint.getTextBounds(leftTxt, 0, leftTxt.length(), m_TWRect);if (Math.abs(m_Offset) >= m_TWRect.width()){m_Paint.setColor(Color.WHITE);c.drawText(leftTxt, m_LRect.centerX(), baseLine, m_Paint);}} else if (m_Offset < 0){//right textm_Paint.setColor(Color.RED);m_RRect.set(getWidth() - Math.abs(m_Offset), 0, getWidth(), getHeight());c.drawRect(m_RRect, m_Paint);m_Paint.getTextBounds(rightTxt, 0, rightTxt.length(), m_TWRect);if (Math.abs(m_Offset) >= m_TWRect.width()){m_Paint.setColor(Color.WHITE);c.drawText(rightTxt, m_RRect.centerX(), baseLine, m_Paint);}}m_Lock.unlock();}private String leftTxt =a6bc"L ITEM";private String rightTxt = "R ITEM";private ReentrantLock m_Lock = new ReentrantLock();private RectF m_CRect;private RectF m_LRect;private RectF m_RRect;private Rect m_TWRect;private Paint m_Paint;float m_ActDownPX;private Animation m_Animation;private float m_Offset = 0;}
相关文章推荐
- Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的!
- Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的!
- android自定义控件波纹ripple效果
- Android Studio 学习笔记01
- 解决maven管理Android项目时pom报错Unknown packaging: apk
- Android 的性能工具用法 III-Traceview
- Android 异常 Didn't find class .... on path: DexPathList[[z
- 模仿QQ快速显示图片效果
- [Android Pro] Android 官方推荐 : DialogFragment 创建对话框
- ViewPager与PagerAdapter深度解析
- Android Handler内存泄露分析
- Android Studio的使用
- Android中的Service使用
- Android Studio中的EditText控件使用详解
- android 音乐播放bug
- Android本地数据安全尝试(上)——SQLCipher
- [Android] Android5.1系统自带的应用启动次数统计
- Android Studio apk 打包流程
- android自定义ListPreference字体大小
- android小问题-------------SimpleCursorAdapter使用时的问题。 java.lang.IllegalArgumentException: column '_id' d