如何在对视图进行缩放后获取实际像素高度和宽度

4
我有一个“seekbar”和一个“ImageView”。在移动seekbar时,我会相应地缩放Imageview。以下是我的全部代码:
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context="com.app.pdf.pdfmetadata.Main2Activity">

<FrameLayout
    android:background="#20000000"
    android:layout_width="match_parent"
    android:layout_height="300dp">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@android:drawable/ic_dialog_info"/> 
</FrameLayout>

<SeekBar
    android:id="@+id/seekbar"
    android:min="1"
    android:max="5"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

Java代码
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Main2Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final View imageView = findViewById(R.id.imageView);
    SeekBar seekBar = findViewById(R.id.seekbar);
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            imageView.animate().scaleX(progress).scaleY(progress).setDuration(0).start();
            int height = imageView.getHeight();
            Log.d(TAG, "onProgressChanged: "+height);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
}

}

如您所见,我只是缩放ImageView并打印其高度。
问题:
在这里,我始终获得一个恒定值96。是否有可能在缩放后获取实际的像素高度?我需要相对于ImageView的父级实际占用高度。在我的示例中,它是300dp高的FrameLayout。在缩放后,我的ImageView占用了多少空间,我该如何获取?

你的意思是 imageView.setScaleX(progress);imageView.setScaleY(progress); 吗?但结果还是一样的。 - doe
图片视图在其父视图中占用了多少实际像素。这就是我需要的。 - doe
希望能对回答提供一些反馈 :) - lelloman
@lelloman接受了答案!抱歉迟了 :) - doe
1个回答

5
问题在于,当您使用scaleXscaleYView进行动画处理时,您并未更改层次结构中View的尺寸,而仅更改了屏幕上呈现的尺寸。 View.getWidth()View.getHeight()返回View在其父View中布局后的大小,而scaleXscaleY仅影响渲染。
为了获得“实际”的渲染大小,需要通过进度乘以视图的宽度和高度。
float renderedWidth = view.getWidth() * progress;
float renderedHeight = view.getHeight() * progress;

此外,调用 animate() 并将持续时间设为 0 有什么意义呢?您可以直接使用 View.setScaleX(float)View.setScaleY(float)
如果您想更好地了解布局和渲染大小/坐标之间的区别,建议您运行此布局。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/redSquare"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_centerHorizontal="true"
        android:background="#ffff0000" />


    <View
        android:id="@+id/blackSquare"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_below="@+id/redSquare"
        android:layout_centerHorizontal="true"
        android:background="#ff000000" />

    <View
        android:id="@+id/blueSquare"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_below="@+id/redSquare"
        android:layout_centerHorizontal="true"
        android:scaleX="2"
        android:scaleY="2"
        android:background="#550000ff" />

</RelativeLayout>

如您所见,黑色正方形的位置就在红色正方形下方。然而,蓝色正方形与红色正方形重叠,即使它们具有相同的属性android:layout_below="@+id/redSquare"。这是因为scaleXscaleY没有改变蓝色正方形的位置,所以蓝色正方形在布局中仍在红色正方形下方,但呈现时它的大小被放大了2倍,因此会与红色正方形重叠。


感谢您的解释! - doe
你没有在层次结构中改变视图的尺寸,而只是屏幕上呈现的尺寸。这些应该由系统保持同步!安卓啊! - CCJ
他们这样做是为了我们,只是为了让我们不感到无聊 :D - lelloman
我不使用SeekBar,而是通过手势来增加比例尺。那么我该如何测量大小呢? - Kinal Mer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接