我在这里彻底迷茫。我试图根据一个基于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_width
和layout_height
设置为0的事实是否只是根据约束来调整大小?如果是这样,我的问题将更改为:如何从受约束的图片/按钮获取宽度和高度,layout_width
和layout_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);
}
});
这是对的吗?运行中是否存在使我的图像不显示的内容?
答案 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());
}
});