实例介绍
【实例简介】
【实例截图】
【核心代码】
public class LoginView extends RelativeLayout { /** Scroller 拖动类 */ private Scroller mScroller; /** 屏幕高度 */ private int mScreenHeigh = 0; /** 屏幕宽度 */ private int mScreenWidth = 0; /** 点击时候Y的坐标*/ private int downY = 0; /** 拖动时候Y的坐标*/ private int moveY = 0; /** 拖动时候Y的方向距离*/ private int scrollY = 0; /** 松开时候Y的坐标*/ private int upY = 0; /** 是否在移动*/ private Boolean isMoving = false; /** 布局的高度*/ private int viewHeight = 0; /** 是否打开*/ public boolean isShow = false; /** 是否可以拖动*/ public boolean mEnabled = true; /** 点击外面是否关闭该界面*/ public boolean mOutsideTouchable = true; /** 上升动画时间 */ private int mDuration = 800; private final static String TAG = "LoginView"; public LoginView(Context context) { super(context); init(context); } public LoginView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public LoginView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } private void init(Context context) { setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setFocusable(true); mScroller = new Scroller(context); mScreenHeigh = BaseTools.getWindowHeigh(context); mScreenWidth = BaseTools.getWindowWidth(context); // 背景设置成透明 this.setBackgroundColor(Color.argb(0, 0, 0, 0)); final View view = LayoutInflater.from(context).inflate(R.layout.view_login,null); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);// 如果不给他设这个,它的布局的MATCH_PARENT就不知道该是多少 addView(view, params);// ViewGroup的大小, // 背景设置成透明 this.setBackgroundColor(Color.argb(0, 0, 0, 0)); view.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub viewHeight = view.getHeight(); } }); LoginView.this.scrollTo(0, mScreenHeigh); ImageView btn_close = (ImageView)view.findViewById(R.id.btn_close); btn_close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dismiss(); } }); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if(!mEnabled){ return false; } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downY = (int) event.getY(); Log.d(TAG, "downY = " downY); //如果完全显示的时候,让布局得到触摸监听,如果不显示,触摸事件不拦截,向下传递 if(isShow){ return true; } break; case MotionEvent.ACTION_MOVE: moveY = (int) event.getY(); scrollY = moveY - downY; //向下滑动 if (scrollY > 0) { if(isShow){ scrollTo(0, -Math.abs(scrollY)); } }else{ if(mScreenHeigh - this.getTop() <= viewHeight && !isShow){ scrollTo(0, Math.abs(viewHeight - scrollY)); } } break; case MotionEvent.ACTION_UP: upY = (int) event.getY(); if(isShow){ if( this.getScrollY() <= -(viewHeight /2)){ startMoveAnim(this.getScrollY(),-(viewHeight - this.getScrollY()), mDuration); isShow = false; Log.d("isShow", "false"); } else { startMoveAnim(this.getScrollY(), -this.getScrollY(), mDuration); isShow = true; Log.d("isShow", "true"); } } Log.d("this.getScrollY()", "" this.getScrollY()); changed(); break; case MotionEvent.ACTION_OUTSIDE: Log.d(TAG, "ACTION_OUTSIDE"); break; default: break; } return super.onTouchEvent(event); } /** * 拖动动画 * @param startY * @param dy 移动到某点的Y坐标距离 * @param duration 时间 */ public void startMoveAnim(int startY, int dy, int duration) { isMoving = true; mScroller.startScroll(0, startY, 0, dy, duration); invalidate();//通知UI线程的更新 } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); // 更新界面 postInvalidate(); isMoving = true; } else { isMoving = false; } super.computeScroll(); } /** 开打界面 */ public void show(){ if(!isShow && !isMoving){ LoginView.this.startMoveAnim(-viewHeight, viewHeight, mDuration); isShow = true; Log.d("isShow", "true"); changed(); } } /** 关闭界面 */ public void dismiss(){ if(isShow && !isMoving){ LoginView.this.startMoveAnim(0, -viewHeight, mDuration); isShow = false; Log.d("isShow", "false"); changed(); } } /** 是否打开 */ public boolean isShow(){ return isShow; } /** 获取是否可以拖动*/ public boolean isSlidingEnabled() { return mEnabled; } /** 设置是否可以拖动*/ public void setSlidingEnabled(boolean enabled) { mEnabled = enabled; } /** * 设置监听接口,实现遮罩层效果 */ public void setOnStatusListener(onStatusListener listener){ this.statusListener = listener; } public void setOutsideTouchable(boolean touchable) { mOutsideTouchable = touchable; } /** * 显示状态发生改变时候执行回调借口 */ public void changed(){ if(statusListener != null){ if(isShow){ statusListener.onShow(); }else{ statusListener.onDismiss(); } } } /** 监听接口*/ public onStatusListener statusListener; /** * 监听接口,来在主界面监听界面变化状态 */ public interface onStatusListener{ /** 开打状态 */ public void onShow(); /** 关闭状态 */ public void onDismiss(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub super.onLayout(changed, l, t, r, b); } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论