如何使用指南

时间:2017-08-02 15:08:50

标签: android button imageview android-constraintlayout

我在这里彻底迷茫。我试图根据一个基于Constraint Layout指南调整大小的按钮动态设置图像的高度和宽度。这将使应用程序能够根据屏幕大小调整图像的大小,使其适用于所有设备,或者这是我的目标。

以下是我正在使用的代码:

ImageView snellen;
Button ghostButton;

private final double HEIGHT_RATIO = 11/8.5;
//private final double DISTANCE_RATIO = 120/8.5;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_snellencharttest);

    snellen = (ImageView) findViewById(R.id.snellen);
    ghostButton = (Button) findViewById(R.id.ghostButton);

    snellen.setX(ghostButton.getX());
    snellen.setY(ghostButton.getY());

    ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) snellen.getLayoutParams();
    params.width = ghostButton.getWidth();
    params.height = (getHeightRatio(ghostButton.getHeight(), HEIGHT_RATIO));

    snellen.setLayoutParams(params);

    System.out.println("########################################################################### WIDTH: " + snellen.getWidth());
    System.out.println("########################################################################### HEIGHT: " + snellen.getHeight());


    ghostButton.setVisibility(View.INVISIBLE);
}

private int getHeightRatio(int ghostHeight, double ratio) {
    double calc = ghostHeight*ratio;
    return ((int) Math.round(calc));
}

要解释我正在尝试做什么:我有一个按钮放在我的xml中,我将在下面提供代码。我想要做的是获取该按钮的x和y位置,然后是高度和宽度,并将图像叠加在按钮所在的位置。在这个例子中,我得到按钮“屏幕”的宽度,然后将高度设置为原始图像大小的比率。然后让按钮消失,因为我正在使用它作为参考。

但是你可以看到我包含了一些SOP,它会告诉我图像的高度和宽度是多少。这两个都返回0.我很困惑,因为当我看到图像时,它肯定大于0比0.这是否使得图像将只是缩放到适合屏幕的大小?如果是这样,那就是我希望实现的目标,但我需要能够获得该图像的宽度和高度。

这是我的xml可能有用:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- ____________________________________________ VERTICAL _________________________________ -->

<android.support.constraint.Guideline
    android:id="@+id/uno"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.05"/>

<android.support.constraint.Guideline
    android:id="@+id/dos"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.95"/>

<!-- __________________________________________ HORIZONTAL _________________________________ -->

<android.support.constraint.Guideline
    android:id="@+id/firstRail"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0"/>

<android.support.constraint.Guideline
    android:id="@+id/secondRail"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="1"/>

<!-- __________________________________________ ECT __________________________________________-->

<ImageView
    android:layout_width="56dp"
    android:layout_height="62dp"
    android:id="@+id/snellen"
    app:srcCompat="@drawable/eyechart"
    android:layout_marginLeft="-7dp"
    app:layout_constraintLeft_toLeftOf="parent"
    android:layout_marginBottom="0dp"
    app:layout_constraintBottom_toTopOf="@+id/secondRail" />

<Button
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:id="@+id/ghostButton"
    app:layout_constraintTop_toTopOf="@id/firstRail"
    app:layout_constraintLeft_toLeftOf="@id/uno"
    app:layout_constraintRight_toRightOf="@id/dos"
    app:layout_constraintBottom_toBottomOf="@id/secondRail"/>

</android.support.constraint.ConstraintLayout>

我只是把ImageView放在一个随机的角落里,因为我稍后会调整它的大小,事实上它会改变位置和大小,所以我认为我的程序正在做我想要的。

正如我之前所说,问题是按钮layout_widthlayout_height设置为0的事实是否只是根据约束来调整大小?如果是这样,我的问题将更改为:如何从受约束的图片/按钮获取宽度和高度,layout_widthlayout_height为0?

对此表示感谢,谢谢。

修改

在显示编辑之前,可能会或可能不相关的小旁注:我使用的图像非常大。我不仅需要将其添加到我的drawable-xhdpi,而且还必须将此行添加到我的清单中,否则我的应用会崩溃:android:hardwareAccelerated="false"

感谢Muthukrishnan Rajendran,我在onCreate中添加了一个帖子,等待视图完全加载,这有助于我获得宽度和高度。不幸的是,当我添加它时,我的图像不再显示。我已将所有内容都放在运行中:

 ghostButton.post(new Runnable() {
        @Override
        public void run() {
            snellen.setX(ghostButton.getX());
            snellen.setY(ghostButton.getY());

            ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) snellen.getLayoutParams();
            params.width = ghostButton.getWidth();
            params.height = (getHeightRatio(ghostButton.getHeight(), HEIGHT_RATIO));

            snellen.setLayoutParams(params);

            System.out.println("########################################################################### WIDTH: " + snellen.getWidth());
            System.out.println("########################################################################### HEIGHT: " + snellen.getHeight());

            ghostButton.setVisibility(View.INVISIBLE);
        }
    });

这是对的吗?运行中是否存在使我的图像不显示的内容?

1 个答案:

答案 0 :(得分:1)

尝试在视图附加到屏幕后获取宽度和高度,应在onCreate方法后完成,

那怎么样?

你可以这样使用

view.post(new Runnable() {
            @Override
            public void run() {

            }

    });

因此,在将此项目附加到活动屏幕

后,run方法将接听电话

因此,对于您的情况,例如,如果您想获得ghostButton的x和y,您应该这样做,

ghostButton.post(new Runnable() {
            @Override
            public void run() {
                snellen.setX(ghostButton.getX());
                snellen.setY(ghostButton.getY());
            }
        });