《Android开发艺术探索》笔记总结——第三章:View的事件体系

MAX30102心率血样模块在STM32F103芯片的程序说明 我希望你已经安装好了Keil MDK5这个软件,也安装了M3内核,可以编译一些STM32F103的一些项目下载程序后步骤: 1-按照下图找到IIC.uvprojx并打开(途中唯一绿色那个图标) 2-编译一次 3-确保0错误,0警告,下图所示 4-点击目标选项,然后找到STM32F103C8,再点debug–CMSIS****(我实际用的JTAG,用不了,选择这个CMSIS****即可)下图所示 5-下图所示,看看你的串口找到了没,找到了就点左下角的OK 6-按图上传到开发板 7-MAX30102接线方法 阅读详情

View的基础知识

坐标:

ViewGroup继承了View,所以ViewGroup本身就是个View
View的的位置是有四个顶点来决定的,分别对应着top、left、right、bottom四个属性,Android中的坐标系是倒着的,x轴的正方向向右,y轴的正方向向下,一个View的坐标表示如图:
在这里插入图片描述

所以View的宽和高需要坐标相减来得到

width = right - left
height = bottom - top

注意:上面的的四个坐标是相对于View的父容器来说的,它是一种相对坐标

获取这四个参数的方法:

Left=getLeft();
Right=getRight();
Top=getTop;
Bottom=getBottom();

从Android3.0开始View额外增加了几个参数:x、y、translationX、translationY,这四个参数也是相对于父容器来说的,其中 x 和 y 是View左上角的坐标,而 translationX 和 translationY 是View左上角相对于父容器的偏移量,这两个参数默认值是0,所以上面的参数的换算关系是:

x = left + translationX
y = top + translationY

需要注意的是:View在平移的过程中,top和left表示的是原始左上角的位置信息,其值并不会发生改变,此时发生改变的是x、y、translationX和translationY这四个参数。
到此,我们就明白了这三个参数的具体含义,我们在查看SDK中的 get/set 方法的时候就不会感到特别乱了。

MotionEvent

MotionEvent主要是三种时间类型:ACTION_DOWN、ACTION_MOVE、ACTION_UP,分别对应按下、移动、抬起的三种操作,如果用户点击屏幕滑动一会再松开对应的事件序列为: DOWN -> MOVE --> MOVE --> ...> MOVE --> UP

在事件中我们一般都会获取事件发生时的x和y坐标,系统提供了两组方法:getX/getY 和 getRawX/getRawY,他们的区别是:getX/getY返回的是相对于当前View左上角的x和y坐标,而 getRawX/getRawY返回的是相对于手机屏幕左上角的 x和y 坐标。

TouchSlop

TouchSlop是系统所能识别出的被认为是滑动的最小距离,这是一个常量,我们可以通过此常量和用户滑动的距离进行比较来决定事件是不是滑动事件,因为滑动的距离太短,系统不会认为它是滑动,这个常量可以通过以下方式获取:

ViewConfiguration. get(getContext()).getScaledTouchSlop()
VelocityTracker

速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度,使用方法如下:
首先在View的onTouchEvent方法中追踪当前点击事件的速度:

VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
//获取当前的速度
velocityTracker.computeCurrentVelocity(1000); //参数为1000,表示获取1s时间内的速度
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();

//最后不再使用的时候,调用clear方法重置并回收内存
velocityTracker.clear();
velocityTracker.recycle();

这里的速度是手指在水平方向划过的像素数,比如上面的设置的时间是1s,获取的速度是在1s内,手指在水平方向划过的像素数,需要注意的是:速度可以为负数,手指从右向左滑动的时候,水平方向的速度即为负值。

GestureDetector

手势检测,用来辅助检测用户的单击、滑动、长按、双击等行为,实际使用也比较简单,书中的使用方式看起来可能比较难理解,这里使用简单一点的方式来说明,比如这里对一个ImageView控件来监听它的双击事件:

ImageView imageGesture = (ImageView) findViewById(R.id.image_gesture);
//创建GestureDetector对象,设置双击监听
final GestureDetector detector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Toast.makeText(GestureActivity.this, "双击666", Toast.LENGTH_SHORT).show();
        Log.e(TAG,"onDoubleTap");
    return super.onDoubleTap(e);

}
});
//接管ImageView的onTouche方法
imageGesture.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return detector.onTouchEvent(event);
    }
});

上面我只重写了一个监听双击的方法,除此之外还有很多其他的方法,如下:
在这里插入图片描述
在日常开发中,比较常用的有:onSingleTapUp(单击)、onFling(快速滑动)、onScroll(拖动)、onLongPress(长按)和onDoubleTap(双击),建议:如果只是监听滑动相关的,建议自己在onTouchEvent中自己实现,如果要监听双击这种行为的话,就使用GestureDetetor

Scroller

用来实现View的滑动效果,使用代码是固定的,如下:

Scroller scroller = new Scroller(mContext);
    // 缓慢滚动到指定位置
    private void smoothScrollTo(int destX,int destY) {
        int scrollX = getScrollX();
        int delta = destX -scrollX;
        // 1000ms内滑向destX,效果就是慢慢滑动
        mScroller.startScroll(scrollX,0,delta,0,1000);
        invalidate();
    }
    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
                scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
                postInvalidate();
        }
    }

我的理解是这个对象只是对自定义View有效果,因为需要在View内部来添加上面的方法,最后在去调用 smoothScrollTo 方法去让View滑动,对于系统提供的View,可以使用动画来完成滑动

View的滑动

三种效果可以实现View的滑动:
1:使用scrollTo/scrollBy
2:使用动画
3:改变布局参数

使用scrollTo/scrollBy

需要注意的是:这两个方法只能改变View的内容的位置而不能改变View在布局中的位置,使用它们进行的滑动是View的内容进行移动,并不能将View本身进行移动,所以如果View的宽和高都使用的 wrap_content 的情况下,使用这两个方法进行滑动,View的内容会被遮挡,甚至无法看到。

其中scrollBy实际上是用scrollTo来实现的,它是基于当前位置的相对滑动,scrollTo是基于所传递参数的绝对滑动,输入的参数都为正数的时候,内容会相对于VIew向左和向上滑动,反之是下右和向下滑动。

经过验证,这两个方法并不是让View平滑的移动过去,会突然转移到目标位置,没有过程的展示。

使用动画

使用动画的方式就不具体说了,在之前的文章中总结过动画的使用,具体见Android 中动画的使用总结

改变布局参数

这种方法就是通过改变要滑动的View的参数来实现效果,即改变LayoutParams,比如我们要把一个Button向右平移100px,我们只需要将这个Button的LayoutParams里的marginLeft参数的值增加100px即可。

还有一种方式是可以在Button的左边放置一个空View,这个空View的默认宽度为0,当我们需要移动目标Button的时候,只需要重新设置空View的宽度即可。重新设置一个View的LayoutParams的代码实现如下:

MarginLayoutParams params = (MarginLayoutParams)mButton1.getLayoutParams();
params.width += 100;
params.leftMargin += 100;
mButton1.requestLayout();
//或者mButton1.setLayoutParams(params);
三种方式的对比:

scrollTo/scrollBy:操作简单,适合对View内容的滑动;
动画:操作简单,主要适用于没有交互的View和实现复杂的动画效果;
改变布局参数:操作稍微复杂,适用于有交互的View。

弹性滑动

实现弹性滑动的三种方式:
1:使用Scroller
2:使用动画
3:使用延时策略

在上一节中提到的三种View滑动的策略,除了动画都是生硬的将View直接移动到设定的坐标位置,不会有中间的过度过程,这样显然很不友好,所以就有了这一节的弹性滑动,就类似动画一样,View的移动是有过程的。

使用Scroller

在第一节的最后提到了Scroller的使用方法,在这里书中主要通过源码的形式来分析scroller怎么实现的弹性滑动,这里我就不再说了,有一点需要注意的是:Scroller实现的弹性滑动也是滑动的View的内容,并没有对VIew本身的位置进行滑动。

通过动画

使用动画,这里就不再说了,属性动画和View动画都可以,属性动画改变了View的实际位置,View动画没有改变VIew的实际位置,具体看我之前总结过的文章Android 中动画的使用总结

使用延时策略

这种方式核心思想是通过发送一系列的延时消息达到的渐进式的效果,具体的可以使用Handler或者VIew的postDelayed方法,也可以使用sleep方法,每次接收到延时信息就进行VIew的滑动,通过不断的发送和接收延时信息就会不断的去改变View的位置,达到弹性滑动的效果。

书中给出了一个例子

private static final int MESSAGE_SCROLL_TO = 1;
    private static final int FRAME_COUNT = 30;
    private static final int DELAYED_TIME = 33;
    private int mCount = 0;
    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
                switch (msg.what) {
                case MESSAGE_SCROLL_TO: {
                        mCount++;
                        if (mCount <= FRAME_COUNT) {
                                float fraction = mCount / (float) FRAME_COUNT;
                                int scrollX = (int) (fraction * 100);
                                mButton1.scrollTo(scrollX,0);
                                mHandler.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO,
                                DELAYED_TIME);
                        }
                        break;
                }
                default:
                        break;
                }
        };
    };

例子中通过Hander的延时消息,使用scrollTo来完成弹性滑动,上面已经说过使用scrollTo滑动的是View的内容,这里滑动的是Button上的text文本。

View的事件分发机制

View的事件分发主要是对MotionEvent的时间分发,在上面已经说过,主要有三个事件:按下、滑动、抬起,在时间分发的时候主要有三个方法来功能完成:dispatchTouchEvent、onInterceptTouchEvent 和 onTouchEvent

public boolean dispatchTouchEvent(MotionEvent ev)

这个方法用来时间分发。如果时间能够传递给当前View,此方法一定会被调用,返回结果受当前View的onTouchEvent 和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。

public boolean onInterceptTouchEvent(MotionEvent event)

这个方法用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会被再次调用,返回结果表示是否拦截当前事件

public boolean onTouchEvent(MotionEvent event)

这个方法在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件。

注意:View类中没有onInterceptTouchEvent,只有其他两个方法,ViewGroup类中三个方法都有,也就是说只有ViewGroup才可以拦截事件

以上三个方法的关系可以用下面的伪代码表示:

public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean consume = false;
        if (onInterceptTouchEvent(ev)) {
                consume = onTouchEvent(ev);
        } else {
                consume = child.dispatchTouchEvent(ev);
        }
        return consume;
}

看完这段伪代码再回去理解上面三个方法的解释就豁然开朗了。

注意:当一个View设置了上面的三个方法都是View的内部方法,我们在自定义View的时候可以重写这三个方法来处理对应的事件传递,但是当一个View设置了OnTouchListener,当VIew需要处理事件时,OnTouchListener中的onTouch方法会被回调,如果返回true,那么此View内部的onTouchEvent方法将不会被调用,如果返回false,当前View的onTouchEvent 方法会被调用。由此可见,给View设置OnTouchListener,其优先级比onTouchEvent要高。

当一个View的onTouchEvent返回false的时候,表示它的父容器的onTouchEvent将会被调用,也就是说当子View的onTouchEvent不消耗这个事件的时候,事件会向上传递,传递给父View的onTouchEvent,如果都不消耗,最终会传递给Activity的onTouchEvent方法。这种情况和现实的情况一样,领导下发任务,一级一级的往下发,当下属无法解决的时候,下属会一级一级的项上反馈。

一个点击事件产生后,它的传递过程为:Activity --> Window --> View

除了上面的知识点,书中列举了11条关于时间分发的知识,这里就不一一列举了,我挑出了几个自己感觉新鲜的:

1:同一个事件序列是指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以down事件开始,中间含有数量不定的move事件,最终以up事件结束。

2:正常情况下,一个事件序列只能被一个View拦截且消耗。

3:事件传递过程是由外向内的,即事件总是先传递给父元素,然后再由父元素分发给子View,通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外

注意:一个事件序列是分为down,move、up,requestDisallowInterceptTouchEvent这个方法只能影响父布局的move和up事件,也就是说子View可以通过调用 requestDisallowInterceptTouchEvent来让父布局不要拦截此事件序列,但是前提是父布局没有拦截down事件,一旦父布局拦截了down事件,后续的move和up事件,不会再去调用父布局的onInterceptTouchEvent去询问,都会交给父布局来处理。具体源码分析,可以看书中3.4.2节(事件分发的源码分析)

从上面的知识点可以知道:onInterceptTouchEvent不是每次事件都会被调用的,如果我们想提前处理所有的点击事件,要选择dispatchTouchEvent方法,只有这个方法能确保每次都会调用,前提是事件能够传递到当前的ViewGroup

View的滑动冲突

滑动冲突的场景

滑动冲突主要是由于界面中内外两层都可以滑动,这个时候当用户去滑动的时候系统不知道滑动事件是数据哪一层的,所以就会出现滑动冲突,滑动冲突主要分为三种:
1:玩不滑动方向和内部滑动方向不一致
2:外部滑动方向和内部滑动方向一致
3:上面两种情况的嵌套
在这里插入图片描述

处理规则

根据上面可以知道滑动冲突的原因是因为可以滑动的View不知道滑动事件是不是自己的,所以冲突的处理规则是根据具体的事件来判断到底由谁来拦截事件。

场景1可以根据用户的手势是水平滑动还是竖直滑动来判断是由谁来拦截事件,而用户水平滑动还是竖直滑动可以通过滑动过程中两个点的坐标来判断;场景2则需要从业务的角度来判断处于什么状态的时候外部View来响应滑动,什么状态内部View来响应滑动;同样场景3也要从业务的角度去区分。

解决方式

先来针对场景1来说,解决方式就要针对处理规则,场景1的处理规则是通过判断用户是上下滑动还是左右滑动然后进行事件的拦截,在事件拦截的时候又有了两种方式,是外部View直接拦截,还是内部View通知外部View要不要拦截,根据上面的两种方式分为外部拦截法和内部拦截法。

外部拦截法:

外部拦截法伪代码:

//父View中的方法
public boolean onInterceptTouchEvent(MotionEvent event) {
        boolean intercepted = false;
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
                intercepted = false;
                break;
        }
        case MotionEvent.ACTION_MOVE: {
                if (父容器需要当前点击事件) {
                       intercepted = true;
                 } else {
                        intercepted = false;
                 }
                break;
        }
        case MotionEvent.ACTION_UP: {
                intercepted = false;
                break;
        }
        default:
                break;
        }
        mLastXIntercept = x;
        mLastYIntercept = y;
        return intercepted;
    }

在上面的模板代码中,我们只需要在ACTION_MOVE事件中根据规则来处理父View是否拦截事件就可以了,同时要在DOWN事件和UP事件中不拦截事件,因为根据前面的分析,如果在DOWN事件中拦截了事件,后面的MOVE和UP事件就会不在去询问是否拦截事件直接全部交给了父View来拦截事件,而UP事件没有太多的意义,所以它也不要拦截事件,以免出现特殊的问题。

内部拦截法:

内部拦截法就是父View不去拦截任何事件,所有事件都传递给子View,如果子View需要此事件就直接消耗掉,否则就交给父容器处理。伪代码如下:

//子View的dispatchTouchEvent方法
public boolean dispatchTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
                parent.requestDisallowInterceptTouchEvent(true);
                break;
        }
        case MotionEvent.ACTION_MOVE: {
                int deltaX = x -mLastX;
                int deltaY = y -mLastY;
                if (父容器需要此类点击事件)) {
                        parent.requestDisallowInterceptTouchEvent(false);
                }
                break;
        }
        case MotionEvent.ACTION_UP: {
                break;
        }
        default:
                break;
        }
        mLastX = x;
        mLastY = y;
        return super.dispatchTouchEvent(event);
    }

如上,内部拦截法也要根据处理规则去修改对应的条件,父容器不能拦截DOWN事件,因为根据上面几节的讲解,DOWN事件并不受FLAFG_DISALLOW_INTERCEPT这个标记位的控制,一旦父容器拦截DOWN事件,那么所有的时间都无法传递给子元素中。同时父元素中要做如下修改

//父元素中的方法
public boolean onInterceptTouchEvent(MotionEvent event) {
        int action = event.getAction();
        if (action == MotionEvent.ACTION_DOWN) {
                return false;
        } else {
                return true;
        }
    }

可以看到内部拦截法要比外部拦截法要复杂一点,因为要分别处理内外两个View的方法,而外部拦截法只需要处理父布局就可以了,同时外部拦截法也更好理解。具体的实例演示可以参考书中的具体实例,这里就不在列出了。

智能体开发套件(ADK)介绍 city } ---") city_normalized = city . lower() . replace(" " , "") # 模拟天气数据库 mock_weather_db = { 阅读详情

相关推荐

loadStop的原因导致的SSUSP

Total内存值是可用来调度的可用内存,当前可用内存为 0M。 loadSched和loadStop的阈值是根据 Total 内存和节点内存来做限制的。 loadStop 50G,现在有大量作业SSUSP,说明之前某个时间点该节点内存可能有低于50G的时候,导致作业SSUSP,具体是否是这个原因引起的需要用 bjobs -l JobID 看下作业的详细信息。 如果是loadStop的原因导致的 SSUSP,根据loadStop设置的阈值,Total 值高于loadStop值后,将逐步恢复挂起的作业

Blueberry521的博客 667

《Android开发艺术探索》笔记:第三章 View的事件体系

3.1 View基础知识 View是Android所有控件的基类;View是一种界面层的控件的一种抽象;ViewGroup是控件组,继承自View。 View的位置主要由它的四个定点来决定,分别对应View的四个属性:top、left、right、bottom,这下坐标都是相对父容器而言的。从3.0开始View增加了x、y、translationX、translationY;x和y是Vie...

twistfatey的博客 250

Chromatix 7实战:从零开始调优ISP模块的完整流程(附常见报错解决方案)

本文提供了高通平台Camera调试工具Chromatix 7的完整实战指南。详细阐述了从环境准备、项目初始化、基础校正(如LSC、BPC)到核心ISP管线(Demosaic、CCM、HDR)及后处理(CAC、ANR)的调优全流程,并附带了常见报错(如“未初始化实例”)的解决方案,旨在帮助工程师建立系统性的调试方法论。

weixin_29290863的博客 623

Android艺术开发探索第三章学习笔记——View的事件体系(上)

参考博客:Android艺术开发探索第三章——View的事件体系(上) 一.View的基础知识 view控件的位置参数 Left = getLeft(); Right = getRight(); Top = getTop(); Bottom = getBottom(): translationX 偏移量 translationY 偏移量 view的触摸事件 ACTION_DO...

你知道的昵称 281

在MDK5.37版本中添加Complier Version 5( 解决Missing Compiler Version 5 )

本文章仅作为个人学习记录,方法也是从其他博主的博客中得到的,链接如下:二、Keil——Missing Compiler Version 5 和 core_cm3.c 问题解决 - YI颗白菜 - 博客园 (cnblogs.com) 问题描述 更新最新的keil版本(MDK5.37)后,在编译以前版本的工程文件时,发现出现了非常多的报错,在网上搜索之后发现原来时编译器版本不匹配的问题,即MDK5.37中使用的是Version 6版本的编译器,而缺少Version 5,对于以前编写的工

leveling99的博客 1万+

AlphaFold-multimer 复合物结构预测

是DeepMind开发的AlphaFold项目的一个扩展,旨在预测蛋白质多聚体的三维结构。蛋白质多聚体是由多个蛋白质亚单位相互组装而成的结构,如酶、膜蛋白复合物和病毒颗粒。理解多聚体的结构对于揭示蛋白质的功能和相互作用非常重要。

MurphyStar的博客 5650

Android艺术开发探索第三章学习笔记————View的事件体系(下)

参考网址:Android艺术开发探索第三章————View的事件体系(下) 一.View的事件分发 1.点击事件的传递规则 dispatchTouchEvent 用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。 onInter...

你知道的昵称 282

基于STM32的智能水温控制系统设计

智能水温控制系统广泛应用于家庭、工业、农业等多个场景,尤其在热水器、恒温泳池和地暖系统中,通过实时监测和调节水温,提高设备的效率和用户的舒适度。本文基于STM32微控制器设计了一个智能水温控制系统,能够实时监测水温、用户设置温度,并根据需要控制加热器或冷却装置,确保水温维持在设定范围内。系统能够根据用户设定自动控制加热和冷却设备,确保水温维持在舒适的范围内,并通过OLED屏实时显示水温信息。在生成的项目基础上,编写水温监测、目标温度设定、加热器和冷却装置控制、OLED数据显示以及超温报警的代码。

2401_88410555的博客 2476

Android开发艺术探索——第三章View事件体系读书笔记

android开发艺术探索——第三章View的事件体系3.1View的基础知识点(一) View 和 ViewGroup Veiw 是Android中所有控件的基类。View是一种界面层的控件的抽象。 ViewGroup也是继承之View,翻译为控件组。ViewGroup内部包含了许多控件。所以View本身可以是单个控件也可以是由多个控件组成的一个控件。 例: Linear

英勇青铜5 871

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用

DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。

AI浩 1561

Android 开发艺术探索读书笔记 第三章 View的事件体系

View的事件体系一 View的基础知识 什么是View   View是android所有控件的基类,View是一种界面层控件的一种抽象,代表了一个控件。所有控件都是View或者ViewGroup的子类,ViewGroup也继承了View,即所有控件都是View的子类。 View的位置参数   View的位置主要由4个顶点来决定的,位置坐标都是相对坐标,相对于父容器。看下图: 上图我

哆啦A梦的博客 986

Unreal5 从入门到精通之 学习Niagara特效系统

UE5 Niagara粒子系统解析 Niagara是UE5中的高性能粒子特效系统,相比传统粒子系统具有完全可编程性和可视化节点编辑两大特点。核心单元发射器(Emitter)分为模板发射器(预设效果如喷泉、火焰)和空白发射器(高度自定义)。系统提供13种预设模板,包括吹飞粒子、五彩纸屑爆发、动态光束等常见特效。 Niagara采用三级模块化设计: 系统级:全局参数设置与更新 发射器级:控制粒子生成规则与行为 粒子级:处理单个粒子的生命周期和渲染 关键模块包括初始化粒子属性、物理模拟、颜色渐变等,支持GPU加速

TxNet 1125

《Android开发艺术探索》读书笔记-第三章 View的事件体系

Android开发艺术探索-读书笔记第三章 View的事件体系3.1 View的基础知识3.1.2 View的位置参数1)View的位置参数top,left,right,bottom都是View相对于父容器的位置坐标 2)x = left + translationX;y = top + translationY 3)View在平移的过程中top和left并不会发生改变,改变的是translat

被代码淹没的小伙子的博客 410

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

《Android 开发艺术探索》随手笔记——第三章View的事件体系

View的坐标 Left = getLeft(); Right = getRight(); Top = getTop(); Bottom = getBottom(); x = left + translationX; y = top + translationY; 一、以上所有坐标均是相对父类View容器来说的。 二、需要注意的是,View在平移过程中的,top 和

legend12300的专栏 604

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android开发艺术探索 读书笔记 第三章 View事件体系

1. View基础知识 2. View的滑动 3. 弹性滑动 4. View的事件分发 5. View的滑动冲突

HuDP的博客 560

《Android开发艺术探索》读书笔记第三章--View的事件体系

本文是《Android开发艺术探索》读书笔记系列第三篇,来看看本章的思维导图。 一、View基础知识 View和ViewGroup View是Andorid中所有控件的基类,ViewGroup可以翻译为控件组,其内部可以包含多个View,它也是继承了View,这意味着View本身就可以是单个控件也可以是多个控件组成的一个控件。 View的位置参数 View的位置主要由四个参数...

一颗烂葱的博客 367

View的事件体系 - Android开发艺术探索读书笔记(第三章)

Android开发艺术探索读书笔记(第三章)尝试使用Markdown语法编写View的滑动三种方法 使用View自身提供的 scrollTo/scrollBy方法 通过动画给View平移效果 通过改变View的LayoutParams使得View重新布局 scrollTo/scrollBy方法只能改变内容位置,而不能改变View的布局位置

没有故事的A同学 908

《Android 开发艺术探索》读后笔记 ---- 第三章 ---- view的事件体系

view 中的left和top 表示的是原始的位置信息,当view在平移时,发生改变的是x y translationx translationy touchslop ViewConfiguration.get(getContext()).getScaledTouchSlop() 可以获取到系统定义的滑动最小认可距离 velocity tracker 速度检测 gesturedetec...

all68896的博客 171

《android开发艺术探索》笔记

android开发艺术探索笔记第一章Activity的生命周期和启动模式1.1 生命周期1.1.1 正常情况下的生命周期分析1.1.2 异常情况下的生命周期分析1.2 Activity的启动模式1.2.2 Activity的Flag1.2.3 IntentFilter的匹配规则第二章 IPC机制 第一章Activity的生命周期和启动模式 1.1 生命周期 1.1.1 正常情况下的生命周期分析 (1)第一次启动:onCreate->onStart->onResume。 (2)当用户打开一个新的

chen_xiaoke的博客 5827

View的事件体系(Android开发艺术探索笔记)

View的事件分发 基本概念及知识 View的位置参数 top(左上y坐标),left(左上x坐标),right(右下x坐标),bottom(右下y坐标),四个坐标全部是相对于父容器 width = right - left height = bottom - top left = getLeft(); top = getTop(); right = getRight(); bottom = g...

Rockphoenix的博客 767

View的事件体系《Android开发艺术探索》笔记

本文是综合了android开发艺术探索与多篇博客并加上自己的思考总结而成的一篇博客,面向面试的读者,View的事件体系是重要的面试点,而面经与参考答案过于简单,无法深入理解,建议阅读本文后,再次对面试题作答,答出属于自己理解的那一份答案。

一名正在成长的程序员 1356

Android开发艺术探索 第三章 view的事件体系

文章目录view的事件体系view基础知识view的滑动弹性滑动view的事件分发机制view的滑动冲突 view的事件体系 view基础知识 view是所有控件的基类,除了view还有viewGroup,其也继承自view。 view的位置和view内容的位置 view的位置对应的四个顶点的位置,分别是top,left,right,bottom。他们可以通过get方法获取。 v...

朝辞的博客 256

Android开发艺术探索——View的事件体系

这是我在学习过程中总结的知识 目的是希望日后回来看或者需要用的时候可以 一目了然 #4caf50 的回顾、巩固、查缺补漏 不追求详细,但会尽力保证读者都能快速理解和快速使用(随理解加深会总结的更加精简),但必要时会附上一些较详细解释的链接 脚注是空白的:表示还没弄懂的知识,了解后会添加(要是大佬看到了可以指教一下那就万分感谢了) 这一章大致讲的是深入对View的理解以便写出完美的自定义控件 3....

Xeldow的博客 973

《Android 开发艺术探索》笔记3--View事件体系

View事件体系思维导图View的事件体系View的基础知识View的位置参数MotionEvent和TouchSlopVelocityTracker GestureDetectorView的滑动scrollTo/scrollBy使用动画改变布局参数"弹性滑动使用Scroller小结Scroller的工作原理:通过动画使用延时策略参看文章 View事件体系思维导图 View的事件体系 View的基础知识 View的位置参数 一个View的位置主要由四个顶点构成, 或者可以就是两个点就可以确定. 分别为左.

行动者&&职业化 2116

《Android开发艺术探索》笔记目录

该笔记以《Android开发艺术探索》为基础,结合Android 9.0代码和官方文档,修正了原书中表述不明确和过时的部分,同时加入了大量的个人理解。 13章,14章,15章是总结性的章节,没有列出,建议直接看原书。 Android开发艺术探索 - 第1章 Activity的生命周期和启动模式 Android开发艺术探索 - 第2章 IPC机制 Android开发艺术探索 - 第3章 View的事...

Think,Make 888

Android开发艺术探索之第三章 view的事件体系

前言: 1.view不属于四大组件,但是它的作用堪比四大组件,甚至比Receiver和Provider还要重要 2.Activity提供可视化的功能,Android系统提供了很多基础控件,比例button,textview.checkbox, 但是很多时候控件不能满足我们的需求,这个时候就需要自定义控件,而控件的自定义就需要对于android整个vi...

随风的博客 384
上一篇: 《Android开发艺术探索》笔记总结——第二章:IPC机制
下一篇: 自定义Launcher桌面图标无法加载的问题
安新小子
博客等级 码龄10年 39粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值