自定义Layout
来源:互联网 发布:java面试基础知识 编辑:程序博客网 时间:2024/05/29 08:42
经常写自定义滚动的Layout ,总是出问题,这次备份一下刚写的可以滑动的Layout,让新手看一下也让自己忘记的时候翻阅一下。这是一个完整的自定义类,可以替换activity中的主视图 使用。
package com.yp.customscrollerview;import android.content.Context;import android.graphics.Color;import android.graphics.Point;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.animation.DecelerateInterpolator;import android.widget.FrameLayout;import android.widget.RelativeLayout;import android.widget.Scroller;import android.widget.Toast;public class CustomView extends RelativeLayout { private Context context; private FrameLayout leftView; private FrameLayout midView; private FrameLayout rightView; Toast toast; public CustomView(Context context) { super(context); init(context); } private void showToast(Context contxt, String text, int len) { if (toast == null) toast = new Toast(contxt); toast.setDuration(len); toast.setText(text); toast.show(); } private void show(String text) { Log.i("test", text); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } Scroller mScroller; private void init(Context context) { mScroller = new Scroller(context, new DecelerateInterpolator()); this.context = context; leftView = new FrameLayout(context); leftView.setBackgroundColor(Color.RED); midView = new FrameLayout(context); midView.setBackgroundColor(Color.GREEN); rightView = new FrameLayout(context); rightView.setBackgroundColor(Color.RED); leftView.setId(0x123); addView(leftView); addView(midView); addView(rightView); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); midView.measure(widthMeasureSpec, heightMeasureSpec); int realWidth = MeasureSpec.getSize(widthMeasureSpec); int tempWidthMeasure = MeasureSpec.makeMeasureSpec( (int) (realWidth * 0.8f), MeasureSpec.EXACTLY); leftView.measure(tempWidthMeasure, heightMeasureSpec); rightView.measure(tempWidthMeasure, heightMeasureSpec); show("width:" + leftView.getMeasuredWidth() + "rightvieww:" + rightView.getMeasuredWidth()); } // @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); midView.layout(l, t, r, b); leftView.layout(l - leftView.getMeasuredWidth(), t, l, b); rightView.layout(l + midView.getMeasuredWidth(), t, r + rightView.getMeasuredWidth(), b); show("___width:" + leftView.getMeasuredWidth() + "rightvieww:" + rightView.getMeasuredWidth()); } // private boolean isTestCompete = false; @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (!isTestCompete) { getEventType(ev); return true; } if (is_event) { show("++++++++++++++++++++++++++"); switch (ev.getActionMasked()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: // int curScrollX = getScrollX(); // show(curScrollX+"");// // // showToast(context, "__" + curScrollX + "", 0); // int dis_x = (int) (ev.getX() - point.x); // int xx = -dis_x + curScrollX; // int finalX = 0; // show("dis_x: "+dis_x+"xx: "+xx+"scroll :"+curScrollX); // if (xx < 0) { // finalX = Math.max(xx, -leftView.getMeasuredWidth()); // } else { // finalX = Math.min(xx, rightView.getMeasuredWidth()); // // } // show("finalX: "+finalX+""); // scrollTo(-200, 0); // point.x = (int) ev.getX(); int curScrollX = getScrollX(); show("scroll" + curScrollX); int dis_x = (int) (ev.getX() - point.x); int expectX = -dis_x + curScrollX; int finalX = 0; show("dis_x: " + dis_x + "expectX: " + expectX + " " + leftView.getMeasuredWidth()); if (expectX < 0) { finalX = Math.max(expectX, -leftView.getMeasuredWidth()); } else { finalX = Math.min(expectX, rightView.getMeasuredWidth()); } show("finalX: " + finalX); scrollTo(finalX, 0); point.x = (int) ev.getX(); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: curScrollX = getScrollX(); if (Math.abs(curScrollX) > leftView.getMeasuredWidth() >> 1) { if (curScrollX < 0) { mScroller.startScroll(curScrollX, 0, -leftView.getMeasuredWidth() - curScrollX, 0, 200); } else { mScroller.startScroll(curScrollX, 0, leftView.getMeasuredWidth() - curScrollX, 0, 200); } } else { mScroller.startScroll(curScrollX, 0, -curScrollX, 0, 200); } invalidate(); is_event = false; isTestCompete = false; break; } } else { is_event = false; isTestCompete = false; } return super.dispatchTouchEvent(ev); } private Point point = new Point(); final int TEST_DIS = 20; boolean is_event; private void getEventType(MotionEvent ev) { show("+++++++++++getEventType+++++++++++++++"); switch (ev.getActionMasked()) { case MotionEvent.ACTION_DOWN: point.x = (int) ev.getX(); point.y = (int) ev.getY(); super.dispatchTouchEvent(ev); break; case MotionEvent.ACTION_MOVE: int dX = (int) Math.abs(ev.getX() - point.x); int dY = (int) Math.abs(ev.getY() - point.y); if (dX >= TEST_DIS && dX > dY) { // 左右滑动 is_event = true; isTestCompete = true; point.x = (int) ev.getX(); point.y = (int) ev.getY(); } else if (dY >= TEST_DIS && dY > dX) { // 上下滑动 is_event = false; isTestCompete = true; point.x = (int) ev.getX(); point.y = (int) ev.getY(); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: super.dispatchTouchEvent(ev); is_event = false; isTestCompete = false; break; } } @Override public void computeScroll() { super.computeScroll(); if (!mScroller.computeScrollOffset()) { return; } int tempX = mScroller.getCurrX(); scrollTo(tempX, 0); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return super.onTouchEvent(event); } // class Point{ // public int x; // public int y; // }}
0 0
- 自定义Layout
- 6. 自定义 Layout Template
- 自定义View Layout
- android 自定义Layout布局
- android 解析自定义layout
- 自定义view&adapterview&layout
- Android自定义Layout
- UICollectionView自定义Layout教程
- 关于自定义layout
- 自定义View Layout过程
- UICollectView自定义Layout布局
- onLayoutLayoutAndroid自定义视图自定义Layout
- QT(7)自定义Layout
- 可以变形的自定义Layout
- 使用自定义Layout代替ViewHolder
- 使用auto layout自定义flipBar
- 自定义ViewGroup-自动换行Layout
- 自定义ViewGroup-自动换行Layout
- Android Studio目录结构浅析
- 分享万能java字符串编码转换工具类
- 邮件发送
- Android Please ensure that adb is correctly located at问题解决,重启就好,别的都扯淡
- qual_camera_video
- 自定义Layout
- java入门教程-8.5Java面向字节流的应用
- 【2】深度学习之排头大兵:Caffe
- IOS开发中的几种设计模式介绍
- iOS使用蓝牙的一些注意事项。
- Android eclipse 打开 总是未响应
- java的反射机制
- c++ static的使用方法
- eclipse中加入多线程的设置