直播弹幕滑动的view
来源:互联网 发布:网络刷手兼职可信吗 编辑:程序博客网 时间:2024/05/29 16:44
我们在做直播项目的时候,进入到直播页面时候,在这个页面会有一个随手指活动的页面,而这些聊天弹幕就是出现在这个页面上的,其实他是在上面覆盖一个viwe,让后让他随手值滑动而实现清屏的操作,这里就用到了onTouchEvent的触摸事件,计算滑动的距离,下面就简单的介绍一下:
直接上代码,注释很全就不一一讲解了,
主布局:
public class MainActivity extends Activity { private RelativeLayout rl_left; private int rlWidth;// 布局的宽度 private static final int MAX_OFFSET = 5;// 5个像素误差,滑动小于5个像素就没有动画 private float downX;// 按下时的点 private float viewXdown;// 按下时View的位置 private boolean lastSlidePull = false;// 最后一次滑动的方向 private float maxOffset = 0;// 最大的滑动距离 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initLeftView();//初始化控件} //获取屏幕宽高 private int getScreenSize() { int width; DisplayMetrics metric = new DisplayMetrics();//DisplayMetircs 类可以很方便的获取分辨率 getWindowManager().getDefaultDisplay().getMetrics(metric);//将当前窗口的一些信息放在DisplayMetrics类中 width = metric.widthPixels; // 屏幕宽度(像素) return width; } private void initLeftView() { rl_left = (RelativeLayout) findViewById(R.id.rl_left); rlWidth = getScreenSize(); rl_left.setX(-rlWidth);// 将rl_left的位置移动到手机屏幕左外 } /** * 使用ValueAnimator将rl_left以动画的形式弹入到界面 */ private void slideToShow() { float startX = rl_left.getX(); ValueAnimator valueAnimator = ValueAnimator.ofInt((int) startX, 0); valueAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int offset = (Integer) animation.getAnimatedValue(); rl_left.setX(offset); } }); valueAnimator.setInterpolator(new DecelerateInterpolator()); float fraction = Math.abs(startX / rlWidth); valueAnimator.setDuration((long) (600 * fraction)); valueAnimator.start(); } /** * 使用ValueAnimator将rl_left以动画的形式弹出去 */ private void slideToHide() { float startX = rl_left.getX(); ValueAnimator valueAnimator = ValueAnimator.ofInt((int) startX, -rlWidth); valueAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int offset = (Integer) animation.getAnimatedValue(); rl_left.setX(offset); } }); valueAnimator.setInterpolator(new DecelerateInterpolator()); float fraction = Math.abs((rlWidth + startX) / rlWidth); valueAnimator.setDuration((long) (400 * fraction)); valueAnimator.start(); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: this.downX = x; this.viewXdown = rl_left.getX(); break; case MotionEvent.ACTION_MOVE: float offset = (event.getX() - downX);// 滑动距离 float posX = viewXdown + offset;// 计算可能的位置 maxOffset = maxOffset > Math.abs(offset) ? maxOffset : Math .abs(offset); if (offset > 0) {// pull to show rl_left.setX(posX < 0 ? posX : 0); if (posX >= 0) {// 防止不跟手,更新downX的值 this.downX += posX; } lastSlidePull = true; } else {// push to hide// rl_left.setX(posX > -rlWidth ? posX : -rlWidth); if (posX <= -rlWidth) {// 防止不跟手,更新downX的值 this.downX += (posX + rlWidth); } lastSlidePull = false; } break; case MotionEvent.ACTION_UP: if (maxOffset < MAX_OFFSET) {// 防止抖动 return super.onTouchEvent(event); } // 使用动画滑动到指定位置 if (lastSlidePull) { slideToShow(); } else { slideToHide(); } break; default: break; } return super.onTouchEvent(event); } @Override protected void onDestroy() { super.onDestroy(); }}
xml布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:background="@mipmap/ic_launcher" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/rl_left" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="nihao" android:textSize="30dp"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30dp" android:text="弹幕"/> </RelativeLayout>></RelativeLayout>
阅读全文
0 0
- 直播弹幕滑动的view
- 视频直播的弹幕
- 直播的弹幕功能
- 仿斗鱼直播的弹幕效果实现
- Bilibili直播的弹幕数据包解析
- 直播类APP的弹幕效果
- 仿斗鱼直播的弹幕效果实现
- 获取斗鱼直播间的弹幕信息
- Android仿网络直播弹幕功能的实现
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- kafka学习笔记 --- Scala实现Kafka producer 和 consumer
- 新系统配置ASP.NET Core 站点
- 集合框架之List集合共性
- nginx.conf详解
- ES6 export & import的基本用法
- 直播弹幕滑动的view
- unix socket function网络编程API大全
- 最常用的6种原型文件格式对比
- 关于CoordinatorLayout和ListView滑动冲突的解决
- X-code8 模拟器截屏时崩溃的解决方法
- Spark Q&A : java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc
- 从数据库中获取数据并输出
- 机器学习入门
- mysql启动错误之eror: Found option without preceding group in config file: /Users/gukey/.my.cnf at line: 1