app直播源代码,下拉查看图文详情效果

app直播源代码,下拉查看图文详情效果

 

1
package com.example.administrator.permissiondemo.activity;<br> <br>import android.content.Context;<br>import android.util.AttributeSet;<br>import android.view.MotionEvent;<br>import android.view.VelocityTracker;<br>import android.view.View;<br>import android.view.ViewConfiguration;<br>import android.view.ViewGroup;<br>import android.widget.Scroller;<br> <br>/**<br> * Created by baoyunlong on 16/6/8.<br> */<br>public class PullUpToLoadMore extends ViewGroup {<br> <br>    private ScrollViewListener scrollViewListener = null;<br> <br>    public void setOnScrollListener(ScrollViewListener scrollViewListener) {<br>        this.scrollViewListener = scrollViewListener;<br>    }<br> <br>    @Override<br>    protected void onScrollChanged(int x, int y, int oldx, int oldy) {<br>        super.onScrollChanged(x, y, oldx, oldy);<br>        if (scrollViewListener != null) {<br> <br>            if (oldy < y) {// 手指向上滑动,屏幕内容下滑<br>                scrollViewListener.onScroll(oldy, y, false);<br> <br>            } else if (oldy > y) {// 手指向下滑动,屏幕内容上滑<br>                scrollViewListener.onScroll(oldy, y, true);<br>            }<br> <br>        }<br>    }<br> <br>    public interface ScrollViewListener {//dy Y轴滑动距离,isUp 是否返回顶部<br> <br>        void onScroll(int oldy, int dy, boolean isUp);<br>    }<br> <br>    public static String TAG = PullUpToLoadMore.class.getName();<br>    MyScrollView topScrollView, bottomScrollView;<br>    VelocityTracker velocityTracker = VelocityTracker.obtain();<br>    Scroller scroller = new Scroller(getContext());<br>    int currPosition = 0;<br>    int position1Y;<br>    int lastY;<br>    public int scaledTouchSlop;//最小滑动距离<br>    int speed = 200;<br>    boolean isIntercept;<br>    public boolean bottomScrollVIewIsInTop = false;<br>    public boolean topScrollViewIsBottom = false;<br> <br>    public PullUpToLoadMore(Context context) {<br>        super(context);<br>        init();<br>    }<br> <br>    public PullUpToLoadMore(Context context, AttributeSet attrs) {<br>        super(context, attrs);<br>        init();<br>    }<br> <br>    public PullUpToLoadMore(Context context, AttributeSet attrs, int defStyleAttr) {<br>        super(context, attrs, defStyleAttr);<br>        init();<br>    }<br> <br>    private void init() {<br>        post(new Runnable() {<br>            @Override<br>            public void run() {<br>                topScrollView = (MyScrollView) getChildAt(0);<br>                bottomScrollView = (MyScrollView) getChildAt(1);<br>                topScrollView.setScrollListener(new MyScrollView.ScrollListener() {<br>                    @Override<br>                    public void onScrollToBottom() {<br>                        topScrollViewIsBottom = true;<br>                    }<br> <br>                    @Override<br>                    public void onScrollToTop() {<br>                    }<br> <br>                    @Override<br>                    public void onScroll(int scrollY) {<br>                    }<br> <br>                    @Override<br>                    public void notBottom() {<br>                        topScrollViewIsBottom = false;<br>                    }<br>                });<br> <br>                bottomScrollView.setScrollListener(new MyScrollView.ScrollListener() {<br>                    @Override<br>                    public void onScrollToBottom() {<br>                    }<br> <br>                    @Override<br>                    public void onScrollToTop() {<br>                    }<br> <br>                    @Override<br>                    public void onScroll(int scrollY) {<br>                        if (scrollY == 0) {<br>                            bottomScrollVIewIsInTop = true;<br>                        } else {<br>                            bottomScrollVIewIsInTop = false;<br>                        }<br>                    }<br> <br>                    @Override<br>                    public void notBottom() {<br>                    }<br>                });<br>                position1Y = topScrollView.getBottom();<br>                scaledTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();<br>            }<br>        });<br>    }<br> <br>    @Override<br>    public boolean dispatchTouchEvent(MotionEvent ev) {<br>        //防止子View禁止父view拦截事件<br>        this.requestDisallowInterceptTouchEvent(false);<br>        return super.dispatchTouchEvent(ev);<br>    }<br> <br>    @Override<br>    public boolean onInterceptTouchEvent(MotionEvent ev) {<br>        int y = (int) ev.getY();<br>        switch (ev.getAction()) {<br>            case MotionEvent.ACTION_DOWN:<br>                lastY = y;<br>                break;<br>            case MotionEvent.ACTION_MOVE:<br>                //判断是否已经滚动到了底部<br>                if (topScrollViewIsBottom) {<br>                    int dy = lastY - y;<br>                    //判断是否是向上滑动和是否在第一屏<br>                    if (dy > 0 && currPosition == 0) {<br>                        if (dy >= scaledTouchSlop) {<br>                            isIntercept = true;//拦截事件<br>                            lastY = y;<br>                        }<br>                    }<br>                }<br>                if (bottomScrollVIewIsInTop) {<br>                    int dy = lastY - y;<br>                    //判断是否是向下滑动和是否在第二屏<br>                    if (dy < 0 && currPosition == 1) {<br>                        if (Math.abs(dy) >= scaledTouchSlop) {<br>                            isIntercept = true;<br>                        }<br>                    }<br>                }<br>                break;<br>        }<br>        return isIntercept;<br>    }<br> <br>    @Override<br>    public boolean onTouchEvent(MotionEvent event) {<br>        int y = (int) event.getY();<br>        velocityTracker.addMovement(event);<br>        switch (event.getAction()) {<br>            case MotionEvent.ACTION_MOVE:<br>                int dy = lastY - y;<br>                if (getScrollY() + dy < 0) {<br>                    dy = getScrollY() + dy + Math.abs(getScrollY() + dy);<br>                }<br>                if (getScrollY() + dy + getHeight() > bottomScrollView.getBottom()) {<br>                    dy = dy - (getScrollY() + dy - (bottomScrollView.getBottom() - getHeight()));<br>                }<br>                scrollBy(0, dy);<br>                break;<br>            case MotionEvent.ACTION_UP:<br>                isIntercept = false;<br>                velocityTracker.computeCurrentVelocity(1000);<br>                float yVelocity = velocityTracker.getYVelocity();<br>                if (currPosition == 0) {<br>                    if (yVelocity < 0 && yVelocity < -speed) {<br>                        smoothScroll(position1Y);<br>                        currPosition = 1;<br>                    } else {<br>                        smoothScroll(0);<br>                    }<br>                } else {<br>                    if (yVelocity > 0 && yVelocity > speed) {<br>                        smoothScroll(0);<br>                        currPosition = 0;<br>                    } else {<br>                        smoothScroll(position1Y);<br>                    }<br>                }<br>                break;<br>        }<br>        lastY = y;<br>        return true;<br>    }<br> <br>    @Override<br>    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {<br>        super.onMeasure(widthMeasureSpec, heightMeasureSpec);<br>        measureChildren(widthMeasureSpec, heightMeasureSpec);<br>    }<br> <br>    @Override<br>    protected void onLayout(boolean changed, int l, int t, int r, int b) {<br>        int childCount = getChildCount();<br>        int childTop = 0;<br>        for (int i = 0; i < childCount; i++) {<br>            View child = getChildAt(i);<br>            child.layout(l, childTop, r, childTop + child.getMeasuredHeight());<br>            childTop += child.getMeasuredHeight();<br>        }<br>    }<br> <br>    //通过Scroller实现弹性滑动<br>    private void smoothScroll(int tartY) {<br>        int dy = tartY - getScrollY();<br>        scroller.startScroll(getScrollX(), getScrollY(), 0, dy);<br>        invalidate();<br>    }<br> <br>    //滚动到顶部<br>    public void scrollToTop() {<br>        smoothScroll(0);<br>        currPosition = 0;<br>        topScrollView.smoothScrollTo(0, 0);<br>    }<br> <br>    @Override<br>    public void computeScroll() {<br>        if (scroller.computeScrollOffset()) {<br>            scrollTo(scroller.getCurrX(), scroller.getCurrY());<br>            postInvalidate();<br>        }<br>    }<br>}

 

以上就是 app直播源代码,下拉查看图文详情效果,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2022-09-22 直播平台源代码,Android 直接打开系统相册应用查看照片
2022-09-22 在线直播系统源码,canvas 生成图片模糊
2022-09-22 直播平台开发,自带干扰线的js随机验证码
2021-09-22 直播app系统源码,实现隐藏标题栏
2021-09-22 直播视频app源码,实现直播内容自定义分页的效果
2021-09-22 直播带货app开发利用ScrollView实现下拉内容刷新的效果
点击右上角即可分享
微信分享提示