本文用于记录平时学习和开发中的一些奇淫技巧。有时候我碰到了一些很惊叹的技巧,时间久了,一到用时就想不起来了,连搜索的关键字都忘记了我就会感到很长郁闷,纠结很长一段时间,所以就有想法把那些东西记录下来,方便平时没事看一看,一来熟悉和温习,二来方便查阅。本文持续更新。
一、Android布局中的clipChildren属性:
clipChildren 顾名思义就是裁剪自布局的意思,当子布局大于父布局的时候,子布局超出来的部分是显示不出来的,被父布局裁剪了,当然设置一下属性就能解决问题了:
android:clipChildren="true"
默认是false
先看个效果图吧:
当初做这个效果的时候是用布局嵌套做的(后来才知道有这种解决方案差点没一口老血吐出来),没错!只需要再外层父布局设置上述说的属性轻松搞定。
不过里面也有个坑,一定要在外层布局设置这个属性,列如下面代码是没有效果的
<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-------