《Android开发艺术探索》第三章----View事件体系

Android开发艺术探索

第三章VIew事件体系

  1. Android中所有控件的基类是什么?
    答:View,View本身就可以是单个控件也可以是多个控件组成的一组控件

  2. View位置参数的整理
    --getLeft():左上角相对于父容器的横坐标
    --getTop( ):左上角相对于父容器的纵坐标
    --getRight( ):右下角相对于父容器的横坐标
    --getBottom( ):右下角相对于父容器的纵坐标
    --getX( )/getY( ):左上角相对于父容器的坐标
    --getTranslationX( )/getTranslation( )T:左上角相对于父容器的偏移量
    x = left +translationX (left是View的原始位置,并不会发生改变)

  3. MotionEvent的三个典型事件和事件序列和TouchSlop

  4. VelocityTracker(速度追踪),GestureDetector(手势检测)和Scroller(弹性滑动对象)
    注意点
    (1)如果只监听滑动相关的,建议自己在onTouchEvent中实现,如果要监听双击行为的话,就使用GestureDetector
    (2)Scroller需要和view的conputeScroll配合使用,conputeScroll可以使view反复绘制达到弹性滑动的效果

  5. View实现滑动的方式有那些?
    答:(1)通过view本身提供的scrollTo/scrollBy方法实现(mScrollX,mScrollY的值,左滑负,下滑负)
    只能改变view内容的位置,不能改变view在布局中的位置
    (2)通过动画给VIew施加平移效果来实现
    注意点
    ①View动画是对View的影响做操作,并没有真正改变view的位置参数。当一个view改变位置并保存状态后,原位置的onclick事件仍可触发
    ②使用属性动画可以解决上述问题,但Android3.0以下不支持属性动画。这时可以这样做兼容性适配①
    --在新位置创建一个和目标Button一模一样的Button(点击事件也一样),当动画完成后,原Button设置不可见
    (3)通过改变View的LayoutParams使View重新布局来实现

  6. 实现弹性滑动的方法?
    答:Scroller、动画和延时策略(handler+scrollTo)

  7. 使用Scroller实现弹性滑动的原理
    答:Scroller本身不能实现View的滑动,他需要配合View的computeScroll方法才能实现弹性滑动,他不断的让view实现重绘(invalidate方法),每次重绘距离起始时间都有一个间隔,通过这个间隔Scroller得出view的当前位置,然后调用scrollTo进行绘制
    注意!:设计思路非常赞,这个过程中对View没有丝毫的引用!所以可以和多种view组合使用

  8. 点击事件的传递(分发)过程?重要的三个方法,分别是做什么的?(记好伪代码,表示三方法之间的关系)

  9. onTouch,onTouchEvent和onClick的优先级顺序?

  10. 如果view中的onTouchEvent返回flase,会发生什么?(父容器的onTouchEvent被调用。层层传递)

  11. 什么是事件序列

  12. 一个事件序列只能被一个view拦截且消耗,一旦一个元素拦截了某次事件,那么同一事件序列内的所有事件都会直接交给它处理。

  13. 某个view一旦开始处理事件,如果它不消耗ACTION_DOWN事件(onTouchEvent返回false),那么同一事件序列中的其他事件都不会再交给他处理,而是交给父元素处理

  14. 某个view开始处理事件,但只消耗了ACTION_DOWN事件,其他没有消耗,会发生什么?

  15. view什么时候onTouchEvent返回false?(设置两个属性值为false)

  16. viewGroup默认不拦截任何事件

  17. view的enable属性不影响onToucheEvent的返回值

  18. 通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,ACTION_DOWN除外。(具体实例?)

  19. Activity对点击事件的分发过程是什么样的?

  20. 顶级View对点击事件的分发过程是什么样的?


    ViewGroup点击事件的分发过程.png
  21. ViewGroup中dispatchTouchEvent源码中,mFirstTouchTarget的作用?

  22. ViewGroup决定拦截事件后,后续的点击事件将会默认交给他处理并且不再调用他的onInterceptTouchEvent方法

  23. 触摸时间传给子View的流程?

  24. 事件传递如何继续/终止?(看dispatchTouchEvent的返回值,true终止遍历,false继续分发)

  25. ViewGroup遍历所有的子元素后事件都没有被合适处理的原因?①②

  26. View处理点击事件的方法?(dispatchTouchEvent源码)

  27. 为什么onTouch(onTouchListener)的优先级高于onTouchEvent?---(方便在外界处理点击事件)

  28. 只要View的CLICKABLE和LONG_CLICKABLE有一个为true,他就会消耗这个事件,onTouchEvent返回true

  29. ACTION_UP触发时onCLick被调用

  30. 滑动冲突的常见场景?三种,具体实例

  31. 滑动冲突的解决方法?两种,外部拦截法,内部拦截法。注意点 ---实例说明

LeetCode11,12

罗马数字和Interge类型的相互转换

罗马数字->Interge:每个罗马字母代表一个数,相加起来即可,注意最后一个数的大小问题
Interge->罗马数字:截取Interge每一位,对应到数字表中,输出字符串即可。注意str=str+value和str=value+str的区别
代码:

string intToRoman(int num)
{
    
    map<int,int> mymap;
    mymap.insert(pair<int,int>(1000,4));
    mymap.insert(pair<int,int>(100,3));
    mymap.insert(pair<int,int>(10,2));
    mymap.insert(pair<int,int>(1,1));   
    
    string s[4][9]={{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
                    {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
                    {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
                    {"M", "MM", "MMM"}};

    string result="";
    int f;
    int n=1000;
    while(num>0)
    {
        f=num/n;
        num=num-f*n;
    
        if(f>0)
        {
            int x=mymap[n];
            result=result+s[x-1][f-1]; //这里就可以定义前后关系啊!! 
        }
        
        n=n/10;
    }
    
    return result;
    
}
int toNumber(char ch)
{
    switch(ch)
    {
            case 'I': return 1;  
            case 'V': return 5;  
            case 'X': return 10;  
            case 'L': return 50;  
            case 'C': return 100;  
            case 'D': return 500;  
            case 'M': return 1000;  
            break;
    }
    return 0;
}
int romanToInt(string s) {
    int ret=toNumber(s[0]);
    for(int i=1;i<s.size();i++)
    {
         if (toNumber(s[i - 1]) < toNumber(s[i])) {  
                ret += toNumber(s[i]) - 2 * toNumber(s[i - 1]);  
            } else {  
                ret += toNumber(s[i]);
            }  
    }
    return ret;
    
}

开发中的问题

  1. AndroidStudio中gradle2.4版本以上对内存占用有优化,不会太爆内存
  2. Android5.0以后,对BaiduApi等权限,如果手机中有同样权限的软件,为防止相互唤醒,会禁止安装(解决办法?)
  3. 项目中引入lib本地jar包报错xxxx\java.exe finished with non-zero exit value 1,是系统不能正确获取lib路径的问题,解决如下:
dependencies {     
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:22.2.1'
    compile files('libs/ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar')
    compile files('libs/fastjson-1.1.43.android.jar')
    compile files('libs/analytics-5.6.1.jar')
    compile files('libs/commons-codec-1.10.jar')
    compile files('libs/IPJ1.jar')
    compile files('libs/layoutlib.jar')
    provided files(getLayoutLibPath())
}
def getLayoutLibPath() 
{
    def rootDir = project.rootDir
    def localProperties = new File(rootDir, "local.properties")
    if (localProperties.exists()) {
        Properties properties = new Properties()
        localProperties.withInputStream {
            instr -> properties.load(instr)
        }
        def sdkDir = properties.getProperty('sdk.dir')
        def compileSdkVersion = android.compileSdkVersion
        Console.println("app compileSdkVersion : " + compileSdkVersion)
        def androidJarPath = sdkDir + "/platforms/" + compileSdkVersion + "/data/layoutlib.jar"
        return androidJarPath
    }
    return rootDir
}

每日问题

  1. 客户端与服务端进行Socket连接时,如何判断客户端断开连接??
    答:服务端判断输入流为NULL时 = =
  2. 巩固回调的实现方式
  3. TCP套接字和UDP套接字的区别
    答:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容