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直播源代码,下拉查看图文详情效果,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 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实现下拉内容刷新的效果