[1240] 使用 CoordinateLayout 可以协调它的子布局,实现滑动效果的联动,它的滑动效果由 Behavior 实现。以前用过小米日历,对它滑动平滑切换日月视图的效果印象深刻。...本文尝试用自定义 Behavior 实现一个带有这种效果的日历。...简介 先上个小米日历的图,让大家知道要做一个什么效果: [strip] 这是小米日历的效果,在用户操作列表的时候,将日历折叠成周视图,扩大列表的显示区域,同时也不影响日历部分的功能使用,有趣且实用。...原本想用原生的 CalendarView,但是 CalendarView 不支持周视图,可自定义程度也不高。 在 GitHub 搜了一下,决定使用 MaterialCalendarView。...这个库比较流行,它支持周月视图的切换,符合 Material Design,也可以自定义显示效果。
文件的加载)->实现按钮的监听方法 5、使用类方法加载xib,简化代码搭建界面 6、自定义视图,使用数据模型装配视图内容 若一个view的内部子控件比较多,通常会考虑自定义一个view 把内部的子控件创建屏蔽起来...: (NSDictionary *) appDictionary; //返回plist文件对应的模型数组 ,使用懒加载 + (NSArray *)appList; 2、使用类方法实例化视图对象,并用数据模型装配视图内容...;数据模型(plist-》字典-》模型)--自定义的Plist 通常放置于Supporting Files目录中 #define kAppViewWidth 80 //视图宽度 #define...,让编译器主动推动对象的实际类型,以避免使用ID,造成开发中不必要的麻烦 1.instancetype 只能使用于返回值类型,不能像id一样用于参数类型;但instancetype比id多的一个好处是:...属性不能使用New 开头进行命名 1.6 @synthesize的用法 ---- @synthesize 中可以定义 与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问
本文的大致内容如下:1、如何实现这样一个双滑块组件2、代码实现概述3、开源地址及功能使用4、相关总结一、如何实现这样一个双滑动组件首先是UI视图,这里可以分为三层或者两层,三层的话,底部的轨道是一层,边框是一层...最重要的就是两个滑块的手势,滑块除了要跟着手势移动之外,还要记录上次手势抬起的位置,便于连续的进行滑动,这里建议采用onTouch事件,而非gesture事件,原因onTouch记录坐标更加准确,且能顺滑的移动组件...实现上需要注意,左右两个滑块需要设置最大和最小阀门,也就是说,左不能滑动超过右的位置,同样,右也不能滑动超过左的位置,当然,也不能超过轨道左右的位置。...建议:在使用的模块路径下进行执行命令。..., viewWidth: number) => void自定义的轨道trackBgLayout() => void自定义的轨道背景视图leftPointerLayout() => void左边滑块视图rightPointerLayout
二、事件传递的三个阶段 分发(dispatch) dispatchTouchEvent public boolean dispatchTouchEvent(MotionEvent event) 根据当前视图的具体实现逻辑...boolean onTouchEvent(MotionEvent event) true 表示当前视图处理对应的事件,事件将不会向上传递给父视图 false 表示当前视图不处理对应的事件,事件将会向上传递给父视图的...view时,就由最内层的onTouchEvent进行处理,如果能处理就返回true消费掉,如果不能处理就返回false,这时事件会重新向外层传递,并由外层的onTouchEvent进行处理,依次类推...,如果onTouch返回true,事件将不会继续传递,最后也不会调用onClick方法,如果返回false,事件继续传递 四、viewGroup的事件分发 viewGroup作为view控件的容器存在,...Android系统默认提供了一系列viewGroup,例如LinearLayout,FrameLayout,RelativeLayout,ListView等 4.1、自定义一个简单的MyRelativeLayout
注意Fragment不能操作基本手势方法,只能通过实现OnTouchListener接口来响应手势事件。...上面可以看出,只有容器类才能操作onInterceptTouchEvent方法,这是因为该方法用于拦截发往下层视图的事件,而控件类已经位于底层只有被拦截的份没有拦截别人的份,同样页面类本身并不拥有下层视图...这样多个控件争相响应同一个手势事件,就会产生滑动冲突,如果没处理好冲突,页面上的某些控件便无法正常使用。避免滑动冲突的处理办法,主要有以下三个: 1、对不同的手势事件,要返回正确的布尔值。...下面示例代码演示了ScrollView拦截垂直滑动而放过水平滑动的功能: import android.annotation.SuppressLint; import android.content.Context...View的滑动方法 虽然Scroller提供了滑动的相关计算函数,但是Scroller本身并不能直接滑动控件。
自定义控件分类: 1、使用系统控件,实现自定义的效果 2、自己定义一个类继承View ,如textView、ImageView等,通过重写相关的方法来实现新的效果 3、自己定义一个类继承ViewGroup...2.确定是使用组合控件的形式还是全新自定义的形式,组合控件即使用多个系统控件来合成一个新控件,你比如titilebar,这种形式相对简单。...如果希望视图的绘制流程(三步)可以完完整整地重新走一遍,就不能使用invalidate()方法,而应该调用requestLayout()了。...(只有在自定义ViewGroup中才用到),这个坐标是相对于当前视图的父视图而言的。...方法执行完,就可以用它获取到宽高,在自定义view内使用view.measure(0,0)方法可以主动通知系统去测量,然后就可以直接使用它获取宽高。
break; case MotionEvent.ACTION_MOVE: if (clickable) { //当前view视图中的点发生改变时...,才有必要传入到被视图管理的drawable与子视图中 drawableHotspotChanged(x, y); } //如果用户手指移出控件...onTouch 和 onTouchEvent 有什么区别,该如何使用 这两个方法都是在 View 的 dispatchTouchEvent 中调用的,onTouch 优先于 onTouchEvent 执行...onTouch 执行需要满足两个条件: mOnTouchListener 的值不能为空 当前点击的控件必须是 enable 的。...因此如果你有一个控件是非 enable 的,那么给它注册 onTouch 事件将永远得不到 执行。
我记得有人问我当初是怎么接触自定义view这东西的。因为他们觉得自定义view这个东西很难。我就回了如下几句话:自定义view你把paint和canvas。弄懂了基本也就差不多了。...简单来说,Window是一个抽象类,是所有视图的最顶层容器,视图的外观和行为都归他管,不论是背景显示,标题栏还是事件处理都是他管理的范畴,虽然能管的事情看似很多,但是没实权,因为抽象类不能直接使用。...下面我们来说说DecorView: 这样,我们做个假设,一个跟布局高度是wrap的控件,我们运行之后可以发现,除了那个控件,留下了大量的空白区域,由于我们的手机屏幕不能透明,所以这些空白区域肯定要显示一些东西...分发(dispatch)–>拦截(onIntercept)–>消费(ontouch) public boolean dispatchTouchEvent(MotionEvent ev) 用来进行事件分发...那么此方法一定会调用,返回结果受当前View的ontouch和下级的dispatchtouchevent影响,表示是否消耗当前事件。
FlipView 更新 翻转视图控件,在应用中常用作图片等内容的翻页/滑动显示。用户可以浏览多个项目,每次显示一个。...在上面的图中,我们看到,翻转视图中有三个项目:1/2/3,每次滑动或点击左右键可以切换显示一个项目。那么Windows 8.1 针对它的更新是什么呢?...在Windows 8中,当用户通过滑动触控切换项目时,FlipView项目切换会进行平滑的滚动。而通过点击或编程时,不会出现平滑的滚动,内容只是简单的切换显示。...多种控件添加Header属性 有些控件在使用中通常会附带标题,来描述控件中值的意义。...NavigateToLocalStreamUri 方法,用于通过自定义解析程序加载本地内容。 (7).
可以调用setEnable()方法来改变视图的可用状态,传入true表示可用,传入false表示不可用。 它们之间最大的区别在于,不可用的视图是无法响应onTouch事件的。...而现在的Android手机几乎都没有键盘了,因此基本上只可以使用requestFocus()这个办法来让视图获得焦点了。...而requestFocus()方法也不能保证一定可以让视图获得焦点,它会有一个布尔值的返回值,如果返回true说明获得焦点成功,返回false说明获得焦点失败。...从View的测量、布局和绘制原理来看,要实现自定义View,根据自定义View的种类不同,可能分别要自定义实现不同的方法。...如果你有一个复杂的UI,你应该考虑写一个自定义的ViewGroup来执行他的layout操作。
目前系统支持以下 5 种状态变化,可以为任意一种状态设置自定义动画: APPEARING:容器中出现一个视图 DISAPPEARING:容器中消失一个视图 CHANGING:布局改变导致某个视图随之改变...,例如调整大小,但不包括添加或者移除视图 CHANGE_APPEARING:其他视图的出现导致某个视图改变 CHANGE_DISAPPEARING:其他视图的消失导致某个视图改变 <?...LayoutTransition() // 为 ViewGroup 容器绑定 LayoutTransition 对象 rootView.layoutTransition = transition // 使用翻转进入的动画代替默认的...LayoutTransition.APPEARING) * 10) transition.setAnimator(LayoutTransition.APPEARING, appearAnim) // 使用滑动动画代替默认布局改变的动画...// 这个动画会让视图滑动进入并短暂地缩小一半,具有平滑和缩放的效果 val pvhSlide = PropertyValuesHolder.ofFloat("y", 0f, 1f)
实现思路 这个效果的实现思路主要围绕手指触屏事件展开,注意点如下: 以ACTION_DOWN和ACTION_UP的Y轴距离差与自定义的滑动阈值作比较来判断是否上滑 借助Scroller类,触发LinearLayout...流畅滑动的效果 使用GestureListener实现阻尼滑动效果 未解锁状态禁止向下滑动 详细设计 基于上述几个注意点,考虑细节分别如下: 有效上滑 ?...方法后刷新视图,以此来达到流畅滑动的效果,其实ViewPager、ScrollView等控件都是通过Scroller来实现流畅滑动的。...(伪)代码实现 首先按自定义控件的套路来,new一个类,继承LinearLayout,填充写好的布局,重写onTouch方法: public class PagerLayout extends LinearLayout...使用到的控件有: XRecyclerView 自定义控件引导页控件PagerLayout(上述实现的控件) 封装PagerLayout的show和hide方法: // 显示视图 public void
比如在使用SliddingMenu菜单的时候,可能会与ViewPager或者其他的一些带有滑动事件的View相冲突,再比如ScrollView嵌套ListView相冲突等等。...因为所有的事件操作都发生在触摸屏上,而在屏幕上与用户交互的就是各种各样的视图组件(View),在Android中,所有的视图都继承于View,另外通过各种布局组件(ViewGroup)来对View进行布局...这是ViewGroup特有的方法,因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的。...运行程序,点击自定义的Button,输出如下(感觉Android Log输出比java System方便观看,之后使用Log): ACTION_DOWN以及ACTION_UP事件传递流程图如下...于是难题出现了,你若把Touch Event都想办法给传到上层了(只能通过返回false来传到上层),那么下层的各种子View就不能处理后续事件了。
介绍本示例使用drawing库的Pen和Path结合NodeContainer组件实现手写绘制功能。...const pen = new drawing.Pen(); // 设置画笔开启反走样,可以使得图形的边缘在显示时更平滑 pen.setAntiAlias(true); //...NodeContainer,接收MyNodeController的实例,将自定义的渲染节点挂载到组件上,实现自定义绘制。...event: TouchEvent) => { this.onTouchEvent(event); }) .id(NODE_CONTAINER_ID)在NodeContainer组件的onTouch...,再使用removeChild方法移除,实现撤销上一笔的效果。
悬浮窗 悬浮窗即可以显示在宿主应用之外的 View 视图,理论上任何 View 都能以悬浮窗形式展示在宿主应用之外甚至锁屏界面,一般在工具类应用中使用的比较多,通过悬浮窗可以很方便的从外界与宿主应用进行交互...Android 中所有视图都是通过 Window 来呈现的,不管是 Activity、Dialog、还是 Toast,它们的视图实际上都是附加在 Window 上的。...WindowManager.LayoutParams 通过名字就可以看出来 它是WindowManager的一个内部类,专门用来描述 view 的属性 比如大小、透明度 、初始位置、视图层级等。...现在这个 Button 虽然可以跟着你的手指移动了,但是你会发现当你拖动一段较小距离时会有很大几率响应它的 Click 事件,这显然不能接受,在拖动这个 Button 的整个过程中会依次触发 ACTION_DOWN...ValueAnimator来平滑计算起始X坐标到结束X坐标之间的值,并更新悬浮窗位置 ValueAnimator animator = ValueAnimator.ofFloat
问题原型: 父控件是自定义的 LinearLayout,目的是实现下拉刷新,这个自定义View的实现下拉操作思想是通过检测 onTouch 事件,然后,子控件有一个 scrollView,它是完全为了实现下滚和滚到底部实现加载更多的监听...在 scrollView 里面的第一层View里面有很多一样的自定义的 View,每个有具备自身的 onClick 和 onTouch 事件,目的是为了在用户点击的时候实现变色和相应。 ...问题来了,根据他说的,每次点击,总是先实现 自定义View的 onTouch 的down,然后是 onClick,而 父 Linearlayout的 onTouch是最后实现,而且,父的 action_down...解决方法: 既然传统的解决方法解决不了,我当时想到的是: 1:子View 使用父类的 onTouch 接口来实现点击和改变颜色,总之就是子View不要自己再实现 onClick和onTouch...这样所会产生的问题: 因为它的这个父View是整个使用onTouch来实现下拉的,所以: 1:用户点击后会产生两次的 onTouch执行,一次是子 View,第二次是 父View。
再比如手机的电池是一个类,电池只为手机提供电源的职责。 在Android开发中,adapter类职责只负责视图的显示,这时候你会说adapter里面还有很多方法比如创建视图,显示视图,提供视图数量等。...就是说adapter创建和显示视图是这个类的职责,而不应该包括视图显示内容的计算逻辑,我只要知道结果就行了。...处理了视图的逻辑,应该把时间格式化的操作放在UserOrder类中。...开闭原则 开闭原则就是在每次有新需求都不能在原来的代码中做修改。你可以一开始的时候就用多态和接口来实现架构,让你的代码更容易扩展,而不是修改。...总结:通常我们为了更简单实例化抽象类,我们推荐使用dagger2。
(), 动作是:0 执行了onTouch(), 动作是:1 测试结果说明 点击按钮会产生两个类型的事件-按下View与抬起View,所以会回调两次onTouch(); 因为onTouch()返回了true...事件都不会执行 从上面对事件分发机制分析知: dispatchTouchEvent()、 onTouchEvent() 消费事件、终结事件传递(返回true) 而onInterceptTouchEvent 并不能消费事件...个前提条件: // 1. mOnTouchListener的值不能为空 // 2....与Android事件分发最相关的知识: 自定义View基础 - 最易懂的自定义View原理系列(1) 自定义View Measure过程 - 最易懂的自定义View原理系列(2) 自定义View...Layout过程 - 最易懂的自定义View原理系列(3) 自定义View Draw过程- 最易懂的自定义View原理系列(4) 接下来我将继续介绍与Android事件分发最相关的知识:自定义View
一、盒子模型翻转示例 1、核心要点 开启透视视图 HTML 页面 呈现 3D 效果 , 需要 设置 3D 空间中的透视效果 属性 , 该属性的 属性值 表示 观察者眼睛 ( 视点 ) 到 3D 转换元素...( 盒子标签模型 ) 的距离 , 单位是像素 ; body { /* 设置透视视图效果 */ perspective: 500px;...} 上述代码 告诉浏览器 , 观察者的眼睛 距离 投影平面 500 像素 , 在 这个距离会影响 3D 转换元素的视觉效果 , 具体效果就是 " 近小远大 " ; 如果不设置 透视视图效果...告诉浏览器 该 盒子模型 及 子盒子模型 所有 可过渡 的属性值在 0.5 秒内平滑地改变 ; 设置 3D 呈现样式 盒子模型 的 父容器 和 子容器 都可以设置 3D 变换效果 , 如果要为 子容器...子绝父相 子盒子使用了绝对定位 父盒子就要使用相对定位 */ position: relative; /* 父盒子 和 子盒子 使用不同的 3D 变换效果
领取专属 10元无门槛券
手把手带您无忧上云