发表于: 2018-10-15 22:18:49
0 761
一、今天完成的事情
1. 学习了ConstarintLayout的属性
之前使用ConstraintLayout基本都是在可视化界面操作的,虽然这样做很方便(ConstraintLayout的初衷就是为了简化界面的编写过程),但如果我觉得如果不去了解它背后的属性的话肯定是不行的,毕竟ConstraintLayout背后仍是通过XML代码实现的。
ConstraintLayout 最基本的属性格式: layout_constraintXXX_toYYYOf ,即将“View A”的方向 XXX 置于 “View B”的方向 YYY 。当中,View B 可以是父容器即 ConstraintLayout ,用“parent”来表示。
- layout_constraintBaseline_toBaselineOf (View A 内部文字与 View B 内部文字对齐)
- layout_constraintLeft_toLeftOf (View A 与 View B 左对齐)
- layout_constraintLeft_toRightOf (View A 的左边置于 View B 的右边)
- layout_constraintRight_toLeftOf (View A 的右边置于 View B 的左边)
- layout_constraintRight_toRightOf
- layout_constraintTop_toTopOf
- layout_constraintTop_toBottomOf
- layout_constraintBottom_toTopOf
- layout_constraintBottom_toBottomOf
- layout_constraintStart_toEndOf
- layout_constraintStart_toStartOf
- layout_constraintEnd_toStartOf
- layout_constraintEnd_toEndOf
-
<TextView
android:id="@+id/tv_my_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:text="@string/me_my_info"
android:textSize="16sp"
android:textColor="@color/black_000000"
app:layout_constraintStart_toEndOf="@+id/iv_my_info"
app:layout_constraintBottom_toBottomOf="@+id/iv_my_info"/>
<View
android:id="@+id/view_line_2"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:background="@color/grey_bababa"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/view_my_info"/>
以上面的代码为例,
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
view_line_2左侧受父布局的左侧约束,右侧受父布局右侧约束
类似于LinearLayout的layout_width="match_parent"
app:layout_constraintTop_toBottomOf="@+id/view_my_info"/>
view_line_2的顶部受view_my_info底部的约束,简单点说就是view_line_2的头部在view_my_info屁股底下。
这些属性很难用语言表达清楚,但只要多实践几次很快就能明白了,可以现在可视化布局做一个约束,然后切换到XML页面看看AS帮我们生成了什么属性,对照着看,这样理解得比较快。
2.设置ImageView中的图片自适应屏幕宽高,不留空白,不改变原图比例
使用ImageView显示图片时,如果要设置图片宽度为屏幕宽度,宽高比不变,高度自适应,那么ImageView的上下就会留有空白,虽然可以通过手动调节ImageView的高度来消除空白,但如果不知到图片的宽高比就不能做到100%准确。解决方法如下
public static void matchAll(Context context,ImageView imageView) {
//ImageView调整后的宽高
int width, height;
//获取屏幕宽高
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
int sWidth = metrics.widthPixels;
int sHeight = metrics.heightPixels;
//获取图片宽高
Drawable drawable = imageView.getDrawable();
int dWidth = drawable.getIntrinsicWidth();
int dHeight = drawable.getIntrinsicHeight();
//屏幕宽高比
float sScale = (float) sWidth / sHeight;
//图片宽高比
float dScale = (float) dWidth / dHeight;
/*
缩放比
如果sScale>dScale,表示在高相等的情况下,控屏幕比较宽,这时候要适应高度,缩放比就是两则的高之比,图片宽度用缩放比计算
如果sScale<dScale,表示在高相等的情况下,图片比较宽,这时候要适应宽度,缩放比就是两则的宽之比,图片高度用缩放比计算
*/
float scale = 1.0f;
if (sScale > dScale) {
scale = (float) dHeight / sHeight;
//图片高度就是屏幕高度
height = sHeight;
//按照缩放比算出图片缩放后的宽度
width = (int) (dWidth * scale);
} else if (sScale < dScale) {
scale = (float) dWidth / sWidth;
width = sWidth;
height = (int) (dHeight / scale);
} else {
//如果两者比例相同
width = sWidth;
height = sHeight;
}
//重设ImageView宽高
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, height);
imageView.setLayoutParams(params);
}
...
private ImageView meBgIV;
@Override
public View onCreateView(Bundle saveInsatnceState) {...
//图片自适应宽高
meBgIV = (ImageView) findViewById(R.id.iv_bg_me);
ImageViewUtil.matchAll(getContext(), meBgIV);
}
二、明天计划的事情
实现设置用户头像(圆形)以及其他个人信息
三、遇到的问题
无
四、收获
学习了ConstraintLayout的基本属性,可以在XML界面编写出ConstraintLayout,做到不依赖可视化界面。
评论