登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 2327|回复: 28

lyy模仿猿题库的情景题UI

[复制链接]

21

主题

55

帖子

81

安币

程序猿

Rank: 2

QQ达人

QQ
发表于 2015-7-22 10:13:30 | 显示全部楼层 |阅读模式
package com.skateboard.viewgroup;

import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;

import com.oppo.examples.R;
/***
*
* 模仿猿题库的情景题UI
* 猿题库的UI之一。双层view.重写RelativeLayout对截屏事件的处理,用子控件去滑动父控件视图。重写ViewPager事件的传递
* 。动态计算布局大小。要的可以找我。
*
* 卓佳群(Droidjia)221803017
*
* QQ:1083573260
* 欢迎您加入该群
*
* @author Lyy
*
*/
/**
*
* com.skateboard.viewgroup.SbRelativeLayout
*
* 在自定义View中,onLayout配合onMeasure方法一起使用,
* 可以实现自定义View的复杂布局。自定义View首先调用onMeasure进行测量,
* 然后调用onLayout方法,动态获取子View和子View的测量大小,然后进行layout布局
*
* @author Lyy
*
* 时间2015,7月20日
*
*/
public class SbRelativeLayout extends RelativeLayout {
        private int screenWidth;
        private int screenHeight;
        // 滑板
        private Button skateboard;
        // 滑屏锁
        private boolean mScrolling;
        // 滑动监听
        public TouchListener touchListener;

        public SbRelativeLayout(Context context) {
                super(context);
                // TODO Auto-generated constructor stub
                init();
        }

        public SbRelativeLayout(Context context, AttributeSet attrs) {
                super(context, attrs);
                init();
                // TODO Auto-generated constructor stub
        }

        public TouchListener getTouchListener() {
                return touchListener;
        }

        public void setTouchListener(TouchListener touchListener) {
                this.touchListener = touchListener;
        }

        public void init() {
                DisplayMetrics dm = getResources().getDisplayMetrics();
                screenWidth = dm.widthPixels;
                screenHeight = dm.heightPixels;
        }

        /***
         *
         * 视图的初始化
         *
         */
        public void viewInit() {
                skateboard = (Button) findViewById(R.id.btn);
                skateboard.setOnTouchListener(onTouchListener);
                this.setFocusable(true);
                // this.setClickable(true);

        }

        /**
         * 返回为ture ,被父控件拦截,触屏事件不会传递到子控件去处理,直接调用父容器的OnTouch方法
         *
         * 返回为假,让子控件去处理滑事件,子控件OnTouch返回为true, 不会再传递给父容器,为false 父控件处理滑屏事件
         *
         */
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
                // TODO Auto-generated method stub
                switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                        // 拦截父控件滑屏
                        mScrolling = false;
                        break;
                case MotionEvent.ACTION_MOVE:

                        mScrolling = false;
                        break;
                case MotionEvent.ACTION_UP:
                        mScrolling = false;
                        break;

                }
                return mScrolling;
        }

        /***
         *
         * onLayout()就是设置每个子View在屏幕那个位置来显示出子View
         *
         */
        @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);
                viewInit();

        }

        private OnTouchListener onTouchListener = new OnTouchListener() {

                int lastX, lastY;

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                        // TODO Auto-generated method stub
                        int action = event.getAction();
                        switch (action) {
                        case MotionEvent.ACTION_DOWN:
                                lastX = (int) event.getRawX();
                                lastY = (int) event.getRawY();
                                break;
                        /**
                         * layout(l,t,r,b) l Left position, relative to parent t Top
                         * position, relative to parent r Right position, relative to parent
                         * b Bottom position, relative to parent
                         * */
                        case MotionEvent.ACTION_MOVE:
                                int dx = (int) event.getRawX() - lastX;
                                int dy = (int) event.getRawY() - lastY;

                                int left = SbRelativeLayout.this.getLeft() + dx;
                                int top = SbRelativeLayout.this.getTop() + dy;
                                int right = SbRelativeLayout.this.getRight() + dx;
                                int bottom = SbRelativeLayout.this.getBottom() + dy;

                                if (left < 0) {
                                        left = 0;
                                        right = left + SbRelativeLayout.this.getWidth();
                                }

                                if (right > screenWidth) {
                                        right = screenWidth;
                                        left = right - SbRelativeLayout.this.getWidth();
                                }

                                if (top < 0) {
                                        top = 0;
                                        bottom = top + SbRelativeLayout.this.getHeight();
                                }
                                if (top > screenHeight - 80) {
                                        break;
                                } else {
                                        touchListener.backTouchState(left, top, right, bottom);
                                }
                                // if (bottom > screenHeight) {
                                // bottom = screenHeight;
                                // top = bottom - Rlienr.this.getHeight();
                                // }
                                // 改变视图的位置
                                SbRelativeLayout.this.layout(left, top, right, screenHeight);
                                //
                                // Log.e("------left---------" + left + "--top-" + top
                                // + "----right--" + right + "---bottom-" + bottom,
                                // "-------");
                                lastX = (int) event.getRawX();
                                lastY = (int) event.getRawY();
                                break;
                        case MotionEvent.ACTION_UP:

                                break;
                        }
                        return false;
                }

        };

        /***
         * Touch监听接口
         *
         * @author Lyy
         *
         */
        public interface TouchListener {

                public void backTouchState(int left, int top, int right, int bottom);

        }
}


img1

img1

ing2

ing2

仿猿题库情景题源码.zip

1.07 MB, 下载次数: 70

code

学习是给自己台阶下的好朋友。学得越丰富,掌握下台阶的方式就越精妙。

0

主题

10

帖子

6

安币

初级码农

Rank: 1

QQ达人

发表于 2015-7-22 15:31:54 | 显示全部楼层
修改了下,更加简洁易懂。

testDraft.rar

1.29 MB, 下载次数: 160

2

主题

1655

帖子

143

安币

程序猿

Rank: 2

QQ达人

发表于 2015-7-22 18:34:43 | 显示全部楼层
支持!!!!!!

0

主题

0

帖子

-20

安币

初级码农

Rank: 1

发表于 2015-7-22 21:37:32 | 显示全部楼层
不错!顶LZ

0

主题

0

帖子

14

安币

初级码农

Rank: 1

发表于 2015-7-22 22:33:59 | 显示全部楼层
前来支持~~~~~~~~~~~~~~~~~~~

0

主题

0

帖子

-10

安币

初级码农

Rank: 1

发表于 2015-7-22 23:30:26 | 显示全部楼层
很给力。。。。很喜欢

0

主题

0

帖子

-14

安币

初级码农

Rank: 1

发表于 2015-7-23 05:30:31 | 显示全部楼层
顶起  很好的帖

0

主题

0

帖子

-9

安币

初级码农

Rank: 1

发表于 2015-7-23 11:30:36 | 显示全部楼层
很不错的哦,支持,加油
*滑动验证:
高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
[email protected]
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表