发表于: 2018-10-15 22:18:49

0 622


一、今天完成的事情

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,做到不依赖可视化界面。



返回列表 返回列表
评论

    分享到