美文网首页
Android 开发中遇到的一些零散知识点记录

Android 开发中遇到的一些零散知识点记录

作者: 耳_总 | 来源:发表于2016-08-26 17:30 被阅读77次

本文用于记录平时学习和开发中的一些奇淫技巧。有时候我碰到了一些很惊叹的技巧,时间久了,一到用时就想不起来了,连搜索的关键字都忘记了我就会感到很长郁闷,纠结很长一段时间,所以就有想法把那些东西记录下来,方便平时没事看一看,一来熟悉和温习,二来方便查阅。本文持续更新。


一、Android布局中的clipChildren属性:

clipChildren 顾名思义就是裁剪自布局的意思,当子布局大于父布局的时候,子布局超出来的部分是显示不出来的,被父布局裁剪了,当然设置一下属性就能解决问题了:
android:clipChildren="true" 默认是false

先看个效果图吧:


1.png

当初做这个效果的时候是用布局嵌套做的(后来才知道有这种解决方案差点没一口老血吐出来),没错!只需要再外层父布局设置上述说的属性轻松搞定。

不过里面也有个坑,一定要在外层布局设置这个属性,列如下面代码是没有效果的

<FrameLayout>
        <FrameLayout
            android:clipChildren="false"
            android:layout_width="100dp"        
            android:layout_height="100dp"
            ....           
            >

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:scaleType="fitXY"
                android:src="@mipmap/ic_launcher"></ImageView>
        </FrameLayout>
    </FrameLayout>

而是要在最外层设置:

<FrameLayout
        android:clipChildren="false">
        <FrameLayou
            ....           
            >

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:scaleType="fitXY"
                android:src="@mipmap/ic_launcher"></ImageView>
        </FrameLayout>
    </FrameLayout>

  • ScorllView的子View充满整个ScorllView
    只需要子啊xml设置属性:
android:fillViewport="true"```

* 自定义LinearLayout的时候重写了onDraw()方法,发现并没有被调用!经过搜索后才发现需要在构造中清除一个标志:setWillNotDraw(false);

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {

         // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点)
         View v = getCurrentFocus();

         if (isShouldHideInput(v, ev)) {
             hideSoftInput(v.getWindowToken());
         }
     }
     return super.dispatchTouchEvent(ev);
 }

 /**
  * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏
  * 
  * @param v
  * @param event
  * @return
  */
 private boolean isShouldHideInput(View v, MotionEvent event) {
     if (v != null && (v instanceof EditText)) {
         int[] l = { 0, 0 };
         v.getLocationInWindow(l);
         int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
                 + v.getWidth();
         if (event.getX() > left && event.getX() < right
                 && event.getY() > top && event.getY() < bottom) {
             // 点击EditText的事件,忽略它。
             return false;
         } else {
             return true;
         }
     }
     // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点
     return false;
 }

 /**
  * 多种隐藏软件盘方法的其中一种
  * 
  * @param token
  */
 private void hideSoftInput(IBinder token) {
     if (token != null) {
         InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
         im.hideSoftInputFromWindow(token,
                 InputMethodManager.HIDE_NOT_ALWAYS);
     }
 }
------end-------

相关文章

网友评论

      本文标题:Android 开发中遇到的一些零散知识点记录

      本文链接:https://www.haomeiwen.com/subject/xkjzsttx.html