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

3D深度饼图的QT实现 首先,我们需要创建一个QT项目并创建一个窗口,用于显示我们的饼图。在QT Creator中,选择创建一个新的QT Widgets应用程序项目,并创建一个新的窗口类。在本文中,我将介绍如何使用QT实现一个3D深度饼图(Pie 3D)的可视化效果。在构造函数中,我们将创建一个饼图(QChartView)并设置饼图的数据。这是一个简单的示例,您可以根据需要自定义和扩展代码来创建更复杂的饼图。现在,我们已经完成了3D深度饼图的QT实现。您将看到一个具有相应数据的3D深度饼图显示在窗口中。3D深度饼图的QT实现。 阅读详情

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的方法,而外部拦截法只需要处理父布局就可以了,同时外部拦截法也更好理解。具体的实例演示可以参考书中的具体实例,这里就不在列出了。

《QGIS快速入门与应用基础》223:纸张大小与方向(A4/A3/自定义) 本文详细介绍了QGIS布局页面设置的核心操作,重点讲解了纸张大小与方向的设置方法。文章首先指出页面设置是地图排版的基础前提,强调合理设置可避免导出打印时出现尺寸不符等问题。随后详细说明了三种打开页面设置面板的方式,并重点解析了纸张设置的要点:标准预设纸张(A4/A3等)适用于大多数场景,提供国内常用规格对照表;自定义纸张则需谨慎使用,需注意单位选择和尺寸限制。通过界面标注图和操作步骤示意图,帮助用户掌握正确的设置方法,确保最终出图符合规范要求。文章特别提醒新手要优先使用标准预设纸张,避免常见错误,为后续地图 阅读详情

相关推荐

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度

AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的,因此 AUCell 与基因表达单位和归一化程序无关。此外,由于细胞是单独评估的,因此可以很容易地应用于更大的数据集。

weixin_40695088的博客 1万+

《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

Shopee商品详情页反爬实战:手把手逆向x-sap-Ri和x-sap-Sec参数(附完整调试过程)

本文详细解析了Shopee商品详情页反爬机制中的x-sap-Ri和x-sap-Sec参数逆向过程。通过JS逆向技术,从环境数据采集到多层哈希运算,完整拆解了这两个关键参数的生成逻辑,并提供了实战技巧和Node.js实现方案,帮助开发者应对Shopee的动态加密挑战。

weixin_33701251的博客 1597

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

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

你知道的昵称 281

一文解释电路中常用电子元器件应用和选型01

电容和二极管是电路中最常用的两个电子元器件,种类和系列众多,这里简单总结一下应用场景和选型方式 电容(Capacitor) 电容的种类(20种以上)和应用非常广泛,但是我经常遇到的无非就是下面这几种: 应用 1.隔直流。 2.旁路(去耦) 3.耦合 4.滤波 5.温度补偿 6.计时 7.调谐 8.整流 9.储能 种类 1. 陶瓷电容 2. 云母电容 3. 铝电解电容 4. 钽

weixin_43904073的博客 2237

告别复杂配置:利用原生DDNS实现IPv6直连群晖的极简指南

本文详细介绍了如何利用原生DDNS实现IPv6直连群晖NAS的极简方法,告别复杂配置。从检查IPv6网络环境、路由器防火墙设置到群晖DDNS配置,一步步指导用户完成设置,并分享移动网络下的使用体验和安全防护建议,帮助用户轻松实现远程访问。

weixin_30918633的博客 414

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

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

你知道的昵称 282

一文读懂客户健康度

什么是客户健康度?客户健康度为什么重要?怎么计算客户健康度?这篇文章,我们来聊聊。

m0_62700043的博客 1420

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

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

英勇青铜5 871

85-Halcon-- gen_cam_par_area_scan_division 函数功能(生成面阵相机镜头参数)

Halcon的gen_cam_par_area_scan_division算子用于生成面阵相机的镜头参数,支持除法畸变模型。该算子输出包含9个参数的元组,包括焦距(Focus)、畸变系数(Kappa)、像素尺寸(Sx,Sy)、主点坐标(Cx,Cy)和图像尺寸。文中详细解析了各参数含义、数学原理(包括畸变矫正公式和坐标转换),并提供了三个工业应用案例:高精度芯片尺寸测量、机器人焊接引导和大视野汽车表面检测。最后给出了完整的相机标定流程,涵盖参数生成、畸变校正和标定配置步骤,适用于工业视觉系统的精确标定需求。

weixin_45590420的博客 915

用 Message Monitoring Overview 打造接口健康驾驶舱:SAP AIF 消息监控实战解析

究竟解决了什么痛点?概括起来,这个应用把SAP AIF的接口监控,从传统的事务码和技术视角,带到了一个更加直观、业务友好的层次:(通过卡片式总览,让你在一个页面上看到所有自己负责的接口及其健康状况。通过和的联动,实现了从接口态势到具体消息的快速钻取。通过Recipient模型和应用,实现了监控职责的灵活分配。借助拖拽排序、搜索过滤等特性,让每个运维人员都可以打造属于自己的接口健康 cockpit。如果你正在做S/4HANA或项目,无论是公有云还是本地部署,只要系统启用了SAP AIF。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 107

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

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

哆啦A梦的博客 986

[Bug已解决] CUDA error 尽管 CUDA 可用且 GPU 受支持-通用排查 RuntimeError 解决方案

[Bug已解决] CUDA error 尽管 CUDA 可用且 GPU 受支持-通用排查 RuntimeError 解决方案

一键难忘的博客 2416

《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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

legend12300的专栏 604

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

HuDP的博客 560

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值