Android 自定义View过程中的一些知识点,持续更新

  • 以下是在自定义View过程中的一些总结,从不理解到理解,从不会到会的一个过程中,中间会学会很多的一些关于自定义view的一些知识点,将其记录下来。好记性不如烂笔头,时时重温,如果有不对的地方请麻烦指证,谢谢

  关于在自定义View过程中的getHeight和getMeasureHeight()这两个的区别:
  getMeasureHeight():
    必须在OnMeasure()这个方法执行之后才能得到控件的宽高,一般在自定View的过程中会使用
    getMeasuredHeight/Width()这个方法获取到控件的宽高.
  getHeight():
    必须在OnLayout这个方法执行完成后能才能得getHeight()的值,这个时候拿到的值是实际我们
    能看到显示在界面上的宽高。
  如果不重写onLayout对控件的摆放位置进行修改的话,这两个拿到的值是相等的。
在代码中可以用如下方式获取到getHeight和getMeasuredHeight这两个方法的值
getHeight();
  view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
      @Override    
      public void onGlobalLayout() {
        //这个是在当view在执行onLayout方法执行完成之后执行的。
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int height = headView.getHeight();    
     }
  });
 
getMeasuredHeight():
  view.measure(0,0)//会通知系统去测量这个view
  view.getMeasuredHeight();//这个时候拿到的值是测量之后的值,不会是0了

关于在自定义ViewGroup中的移动
主要有三种方式:
     layout(l,t,r,b);
    scrollTo(x,y);
    offsetLeftAndRight(offset);      左右同时移动
    offsetTopAndBottom(offset);      上下同是移动
移动的不是子View的位置,而是移动的是当前ViewGroup的边框在移动。

/**
  *当前ViewGroup的1级子view全部加载完成调用,可以初始化子view的引用
  *这里只写了两个View的示例
  */
@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mLeftView = getChildAt(0);
    mLeftViewWidth = mLeftView.getLayoutParams().width;
    Log.d("SlideMenu", "mLeftViewWidth:" + mLeftViewWidth);
    mMainView = getChildAt(1);
    mMainViewWidth = mLeftView.getLayoutParams().width;
    /**
     *下面这两个方法是拿不到控件的宽度的,可以用 mLeftView.getLayoutParams().width这个方        
     *法拿到控件的宽
    */
    int width = getWidth();
    int measuredWidth = getMeasuredWidth();
}

关于ViewDragHelper的使用
ViewDragHelper的移动效果内部也是利用了offsetLeftAndRight(offset)和offsetTopAndBottom(offset)这两个方法
这两个方法在高版本中已经实现了刷新的方法,而在低版本中,并没有实现
这会导致
onViewPositionChanged(View changedView, int left, int top, int dx, int dy)
这个方法的回调后不能移动的问题,解决的方法,重写这个方法,添加invalidate()就能实现低版本的兼容,
        @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
            //do somthing
            invalidate();
        }

同样低版本的原因,view设置绽放,平移,等一些操作,如果有明确的指明兼容低本的话,可以引入
兼容低版本.png
    用法:
        低版本:
        ViewHelper.setScaleX(view, value);
        ViewHelper.setScaleY(view, value);
        ViewHelper.setTranslationX(view, value);
        ViewHelper.setAlpha(view,value);
        ……
      高版本:
        view.setScaleX(value);
        view.setScaleY(value);
        view.setAlpha(value);
        view.setTranslationX(value);
        ……
两者效果是一样的
OnTouchEvent(event)获取action的两种方法
  

    重绘的界面有多种:
    invalidate();
    postInvalidate();//线程中使用
    ViewCompat.postInvalidateOnAnimation(viewgroup);// 

在自定义View的自定义属性中,有很多不同的自定义属性通过xml的方式来获取,由于android 的adt14以上的版本的R.java的id类不再设置为final类型,导置我们在写成一个Library的时候,如果在获取的时写成switch case语言编译器会报错,可以写成if else的形式来获取,或者直接获取属性对应的值,这个在eclise和Android Studio都会出现的问题,不是编译器的问题

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

推荐阅读更多精彩内容