面目项目文档

1.带有缩放效果的头部视差的实现:

--》自定义一个view继承listview,以便实现滑动

--》重写三个构造方法;

重写overScrollBy()方法--当各种能滑动的listview滑动到顶部或尾部之后继续滑动会调用该方法;

重写onTouchevent()方法,当手指抬起的时候实现将缩放的动画平滑的恢复原状

   --》通过setImageviewImageview  imageview)方法,让外界传入用于头部展示的图片--》接着通过给imageview设置一个全局的布局监听器来获取imageview最初的宽高(并不一定是图片真实的宽高)

设置全局布局监听:

imageview.getViewTreeObserver().addOnGlobalLayoutListener

移除监听:

imageview.getViewTreeObserver().removeOnGlobalLayoutListener(this);

   --》在overScrollBy()方法中,让imageview调用layout方法对图片进行布局,上边界不变,左右和底部随手指的滑动同步向外拉伸,若想让缩放的效果不是那么明显可以将deltaY/2deltaY/3,最后请求重新布局

// LinearLayout.LayoutParams params  = (LinearLayout.LayoutParams) imageView.getLayoutParams();
 //ViewGroup.LayoutParams params = imageView.getLayoutParams();
 
 //params.height = imageView.getBottom()-deltaY;
// imageView.setLayoutParams(params);

 
imageView.layout(imageView.getLeft()+deltaY,0,imageView.getRight()-deltaY,imageView.getBottom()-deltaY);
imageView.requestLayout();  //获将注释解开。将该句注释掉也可以

 

--》因为在overScrollBy()方法中已经实现了手指按下滑动的操作,所以在onTouchevent()方法中只需要处理手指抬起的动作就好,手指抬起的时候通过设置值动画来让图片平滑的恢复如初(值动画的值从图片当前的宽高,变化到图片最初的宽高),同时设置回弹差值器,让其有回弹的感觉

switch(ev.getAction()) {
     case MotionEvent.ACTION_UP:
         //通过值动画让imageview的高度一点点的回到最初的位置高度
         
animator = ValueAnimator.ofInt(imageView.getHeight(),originalHeight);
         //监听动画值的改变实现自己的动画
         
animator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
             @Override
             public voidonAnimationUpdate(ValueAnimator animation) am{
                 //获取动画的值,
                 
intanimateValue = (int)animator.getAnimatedValue();
                 //将动画的值设置给imageview的高度
                 
ViewGroup.LayoutParams params =imageView.getLayoutPars();
                 params.height = animateValue;
                 //params.width = imageView.getWidth() - (imageView.getHeight() - animateValue);

                 
imageView.setLayoutParams(params);

             }
         });
         animator.setInterpolator(new OvershootInterpolator(3));
         animator.setDuration(400).start();
         break;

 

 

 

 

2.自定义的侧滑菜单

还是继承Fragmlayout,重写三个构造方法,重写onMeasure()方法--测量子view的宽高measureChildview,宽的测量规则,高的测量规则)--getmeasureWidth()方法就可以拿到子view的宽高; 重写onlayout()方法,摆放子view,但因为继承了fraglayot,所以上面的两个方法都可以不用写。

--》通过viewDragHelper这个类来实现实现子view的移动(通过layout布局或scrollTo方法也可以)

   --》创建viewDragHelper对象,重写回调中的相应方法,tryCaptureView方法,判断是否捕获当前触摸的子view的触摸事件;

clampViewPositionHorizonta中返回left,左右就可以随便滑动了;在这个方法中需要对子view的移动范围进行限制,如主界面向右的最大移动范围设为slidingmenu宽的百分之六十;让主界面不能向左移动,即如果left<0,将left置为0,令left = 0;

clampViewPositionValtical中返回top,上下九可以随便滑动了

onViewPositionChanged方法在子view发生移动时被调用,一般用于实现子view的伴随移动,在这个方法中如果当前滑动的是菜单界面,那么主界面需要实现伴随移动:首先对菜单界面调用layout方法,将菜单界面固定住--》确定伴随移动的最大范围--》主界面调用layout方法,实现主界面的伴随移动--》因为每个view被滑动时都会执行该方法,所以滑动动画在该方法中设置--》给slidingmenu的背景图片添加颜色的遮罩此效果,getBackground().setColorFilter(颜色的计算器,PorterDuff.Mode.SRC_OVER

onViewReleased方法,当手指抬起的时候会调用该方法,在这个方法中我需要判断当手指抬起时,主界面是滑向左边还是滑回右边--》当主界面的getLeft值也就是它左边的位置大于最大滑动范围的一半时,滑向右边;否则滑回左边--》但在自动滑回的过程中不能采用调用layout方法的方式,这样会瞬间完成滑动,缺少平滑的效果--》因此调用viewDragHelpersmoothSlideViewTo(要滑动的view,最终的left值,最终的top)方法来实现平滑滑动的效果--》但注意:该方法不能单独使用,没有效果,须要配合computeScroll方法一起使用才会生效--》调用ViewCompat.postInvalidateOnAnimation(SlideMenu.this); (这种方法更省内存)会自动执行omputeScroll方法 --》详情翻看源码

 

  --》最后,因为外界在使用该自定义控件的时候,可能针对view滑动的不同状态,去执行相应的操作--》所以自定义view应该对外暴露出接口,让外界知道view执行过程中的各个状态--》定义监听器,包含三种状态:菜单打开,菜单关闭,菜单滑动--》因为这三个状态都牵涉到子view位置的改变,所以在onViewPositionChanged方法对接口进行回调--》另外需要注意的是:因为该方法会被频繁的调用,所以为了避免频繁的调用回调,应设置状态标识符保存当前view的状态,当满足一定状态时才可以进行回调

 

 

   --》但注意:要想让回调中的方法生效,必须要给viewDragHelper传入触摸事件,因此须要重写onInterceptTouchEvent(MotionEvent ev)--viewDragHelper帮我们判断是否拦截触摸事件;重写onTouchEvent(MotionEvent event)--将触摸事件传递给viewDragHelper解析,让它来帮我们处理该事件,这时回调方法才会生效。

--》当菜单打开时,处理主界面的触摸事件,将其拦截并消耗掉--》重新定义一个线性布局,在里面判断当菜单处于打开状态时,拦截并消费掉事件

 

3.界面布局的搭建:

虽然继承的是帧布局,默认下面的view会覆盖在上一个view上面,但在这里对自定义view的使用没用任何影响,因为本来界面显示的时候就只显示一个,默认主界面覆盖在菜单界面上面;之后当菜单被打开时,主界面缩小,但最终缩小后的主界面还是覆盖在菜单界面上面的,只是仅覆盖了一小部分,所以两个界面都可以显示出来。

 

--》使用自定义的dragLayout--》在布局文件中外层使用自定义的draglayout,里面嵌套两个framelayout帧布局--》再另创建两个view,都继承fragment,一个主界面的view和一个菜单界面的view--》在主activity中找到两个帧布局,然后通过帧布局管理器将主界面的fragment和菜单界面的fragment分别添加到帧布局中,从而将主界面分成两个模块

--》主界面使用的是pageSlidingTab + viewpPager + radioGroup,来完成整体布局

--》主界面radiogroup + viewPager(自定义的没有滑动效果的viewPager)填充剩余空间

--》

--》在这个viewPager中,将要展示的几个fragment添加到集合中,给viewpager设置适配器展示集合中 的界面(在这里因为适配器展示的都是fragment,所以适配器继承fragmentPagerAdapter)

--》给radiogroup的每个选项设置状态选择器,属性设为state_checked--》给radiogroup设置监听事件(setOnCheckedChangeListener),在switch中根据选中的按钮,调用viewPager.setCurrentItem(第几个fragment,是否取消动画),来实现界面的切换

--》因为每个fragment界面都有相同的部分,加载布局,加载数据--》所以将其抽取到基类baseFragment中,对外暴露出相应的接口,因此子类要做的就是继承baseFragment,然后只需要实现加载布局和加载数据的方法就可以了(强制子类根据自身要加载的布局和加载的数据,去实现这两个方法)

--》在基类baseFragment中通过一个自定义的布局loadingPage(继承帧布局)来加载数据和相应的布局,因为每个界面要加载的布局和数据都是不同的,需要子类自己去实现,所以同样对暴露出两个接口--》因此在基类baseFragment中通过它来加载布局,数据的时候,只需要在oncreateview 方法中创建loadingpager对象(会要求重写加载布局和加载数据的方法),并返回该对象就可以了

--》因为loadingPager是用来加载界面和数据的,但加载中的view(一个圆圈)和加载失败的view,对所有的界面来说都是一样的,因此,可以直接写死在loadingPager中

 

--》轮播图的viewPager需要自定义,因为需要处理触摸事件,当在第一页且由左向右滑动时,才将触摸事件交由父控件处理,其余情况请求父控件不拦截事件

--》其次需要为轮播图中的图片设置触摸监听 setOnTouchListener,当手指按下的时候停止轮播,手指抬起的时候继续轮播

 

--》如果不想要viewPager的预加载功能,可以给其设置界面切换监听,只有在界面被选中,也就是界面切换完成的时候在加载数据

侧滑效果怎么取消

主界面的布局搭建

当手指滑动轮播图的时候,轮播图停止自动轮播

 

#沉浸式说明:

因为手机最上面的导航栏(也就是现实电量,WiFi的那一块)默认是黑色的,感觉和手机app的界面颜色不符,所以搞出来了沉浸式这么一个东西,说白了就是让最上面个的导航栏变透明或个手机应用的actionbartoolbar的颜色相近

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值