专栏首页Android开发指南13.按比例显示图片、自定义属性、测量

13.按比例显示图片、自定义属性、测量

有时候服务器返回的图片有可能宽高是不一样的,所以需要按照一定宽高比例去显示,修改专题界面

自定义属性

<resources>
 <declare-styleable name="com.itheima.googleplay.view.RatioLayout">
 <attr  name="ratio"  format="float"></attr>
 </declare-styleable>
</resources>

RatioLayout

public class RatioLayout extends FrameLayout {
 // 按照宽高比例去显示
 private float ratio = 2.43f; // 比例值,不要去写死,这样只需要调下方法根据自己需要去修改
 public void setRatio(float ratio) {
 this.ratio = ratio;
 }
 public RatioLayout(Context context) {
 super(context);
 }
 public RatioLayout(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 // 参数1 命名控件 参数2 属性的名字 参数3 默认的值
 float ratio = attrs.getAttributeFloatValue(
 "http://schemas.android.com/apk/res/com.itheima.googleplay",
 "ratio", 2.43f);
		setRatio(ratio);
 }
 public RatioLayout(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }
 // 测量当前布局
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 // widthMeasureSpec 宽度的规则 包含了两部分 模式 值
 int widthMode = MeasureSpec.getMode(widthMeasureSpec); // 模式
 int widthSize = MeasureSpec.getSize(widthMeasureSpec);// 宽度大小
 int width = widthSize - getPaddingLeft() - getPaddingRight();// 去掉左右两边的padding
 int heightMode = MeasureSpec.getMode(heightMeasureSpec); // 模式
 int heightSize = MeasureSpec.getSize(heightMeasureSpec);// 高度大小
 int height = heightSize - getPaddingTop() - getPaddingBottom();// 去掉上下两边的padding
 if (widthMode == MeasureSpec.EXACTLY
 && heightMode != MeasureSpec.EXACTLY) {
 // 修正一下 高度的值 让高度=宽度/比例
			height = (int) (width / ratio + 0.5f); // 保证4舍五入
 } else if (widthMode != MeasureSpec.EXACTLY
 && heightMode == MeasureSpec.EXACTLY) {
 // 由于高度是精确的值 ,宽度随着高度的变化而变化
			width = (int) ((height * ratio) + 0.5f);
 }
 // 重新制作了新的规则
		widthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY,
				width + getPaddingLeft() + getPaddingRight());
		heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY,
				height + getPaddingTop() + getPaddingBottom());
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }
}

布局:把imageview包裹住就可以不用修改imageview了,它根据它的父容器去显示

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:itheima="http://schemas.android.com/apk/res/com.itheima.googleplay"
 android:layout_width="match_parent"
android:layout_height="match_parent">
 <com.itheima.googleplay.view.RatioLayout
            android:id="@+id/rl_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp" 
            itheima:ratio="2.43">
 <ImageView
                android:id="@+id/item_icon"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:scaleType="fitCenter"
                android:src="@drawable/ic_default" />
 </com.itheima.googleplay.view.RatioLayout>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android刮刮卡自定义控件

    六月的雨
  • 15.瀑布流、测量

    六月的雨
  • 用最简单的例子说明设计模式(二)之模版方法、策略模式、组合模式、观察者模式

    六月的雨
  • HDU 2389 二分图最大匹配之Hopcroft-Karp优化 O(n^0.5*m)

    T个测试用例, 时间time, n个人,接下来n行是坐标 和 每个人的速度 v。 m,接下来m行是 雨伞的坐标。

    用户2965768
  • HDU 6319 单调队列

     题目:http://acm.hdu.edu.cn/showproblem.php?pid=6319

    用户2965768
  • 每天都在用printf,你知道变长参数是怎么实现的吗

    变长参数,指的是函数参数数量可变,或者说函数接受参数的数量可以不固定。实际上,我们最开始学C语言的时候,就用到了这样的函数:printf,它接受任意数量的参数,...

    编程珠玑
  • 变长参数探究

    变长参数,指的是函数参数数量可变,或者说函数接受参数的数量可以不固定。实际上,我们最开始学C语言的时候,就用到了这样的函数:printf,它接受任意数量的参数,...

    编程珠玑
  • POJ 3041 Asteroids(匈牙利算法)

           题意就是有一个地图,然后给你几个点的坐标标记为'x',然后你有一个武器,每次可以消灭一行或一列的'x',问最少需要几次能把所有的'x'消灭完。然后...

    Ch_Zaqdt
  • Remove Element

    问题:删除数组中和elem相等的元素,并且返回新数组大小。英语不好。。。读错题了。。 class Solution { public: int remo...

    用户1624346
  • BZOJ4259: 残缺的字符串(FFT 字符串匹配)

    考虑把B翻转过来,如果\(\sum_{k = 0}^M (B_{i - k} - A_k)^2 * B_{i-k}*A_k = 0\)

    attack

扫码关注云+社区

领取腾讯云代金券