自定义 Drawable 无法在 ImageView 中正确显示
Custom Drawable does not properly display in ImageView
我正在开发一个 Android 应用程序,它需要显示一些动态生成的图像。我试图通过创建一个 activity 来实现它,它 (1) 创建一个自定义的 Drawable 对象,并且 (2) 显示缩放以适合 ImageView 并居中的 Drawable。我的问题是,当我 运行 我的测试设备上的应用程序时,图像显示为水平线,而不是应有的正确矩形图像。我不知道发生了什么。我希望我只是以某种方式错误指定了布局。
这是 Java 代码:
public abstract class InstructionsActivity extends AppCompatActivity implements Constants {
public static final int DIAGRAM_SCALE = 50;
Instructions instructions;
TextView instructionsView;
ImageView diagramView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_instructions);
Intent intent = getIntent();
int number = intent.getIntExtra(ShapeActivity.NUMBER,1);
double[] measurements = intent.getDoubleArrayExtra(ShapeActivity.MEASUREMENTS);
instructions = instructions(number,measurements);
instructionsView = findViewById(R.id.instructionsTextView);
diagramView = findViewById(R.id.diagramView);
instructionsView.setText(instructions.getText());
diagramView.setImageDrawable(instructions.getDiagram());
}
public abstract Instructions instructions(int number, double[] measurements);
}
public class RectangleInstructionsActivity extends InstructionsActivity {
@Override
public Instructions instructions(int number, double[] measurements) {
Instructions output = new Instructions();
// Various calculations omitted for brevity
StringBuilder sb = new StringBuilder();
// Text generation omitted for brevity
output.setText(sb.toString());
// Diagram-producing block
final float diagramWidth = (float)(BOLT*DIAGRAM_SCALE);
final float diagramHeight = (float)(f[orientation]*DIAGRAM_SCALE);
Drawable diagram = new Drawable() {
@Override
public void draw(Canvas canvas) {
canvas.drawRect(0,0,diagramWidth,diagramHeight,output.getBackground()); // Test rectangle
}
// Other Drawable methods omitted for brevity
};
diagram.setBounds(0,0,(int)Math.ceil(diagramWidth),(int)Math.ceil(diagramHeight));
output.setDiagram(diagram);
// Output
return output;
}
}
这里是 ImageView 的 XML 布局,它设置在 ConstraintLayout 中:
<ImageView
android:id="@+id/diagramView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="12dp"
android:layout_marginRight="12dp"
android:contentDescription="@string/diagram_description"
android:scaleType="fitCenter"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/instructionsTextView"
app:srcCompat="@android:drawable/screen_background_light" />
非常感谢您的帮助和建议。
经过反复试验,似乎解决方案——或者无论如何,一种解决方案——是为 activity 的 xml 中的 ImageView 指定 android:adjustViewBounds="true"
文件。
我正在开发一个 Android 应用程序,它需要显示一些动态生成的图像。我试图通过创建一个 activity 来实现它,它 (1) 创建一个自定义的 Drawable 对象,并且 (2) 显示缩放以适合 ImageView 并居中的 Drawable。我的问题是,当我 运行 我的测试设备上的应用程序时,图像显示为水平线,而不是应有的正确矩形图像。我不知道发生了什么。我希望我只是以某种方式错误指定了布局。
这是 Java 代码:
public abstract class InstructionsActivity extends AppCompatActivity implements Constants {
public static final int DIAGRAM_SCALE = 50;
Instructions instructions;
TextView instructionsView;
ImageView diagramView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_instructions);
Intent intent = getIntent();
int number = intent.getIntExtra(ShapeActivity.NUMBER,1);
double[] measurements = intent.getDoubleArrayExtra(ShapeActivity.MEASUREMENTS);
instructions = instructions(number,measurements);
instructionsView = findViewById(R.id.instructionsTextView);
diagramView = findViewById(R.id.diagramView);
instructionsView.setText(instructions.getText());
diagramView.setImageDrawable(instructions.getDiagram());
}
public abstract Instructions instructions(int number, double[] measurements);
}
public class RectangleInstructionsActivity extends InstructionsActivity {
@Override
public Instructions instructions(int number, double[] measurements) {
Instructions output = new Instructions();
// Various calculations omitted for brevity
StringBuilder sb = new StringBuilder();
// Text generation omitted for brevity
output.setText(sb.toString());
// Diagram-producing block
final float diagramWidth = (float)(BOLT*DIAGRAM_SCALE);
final float diagramHeight = (float)(f[orientation]*DIAGRAM_SCALE);
Drawable diagram = new Drawable() {
@Override
public void draw(Canvas canvas) {
canvas.drawRect(0,0,diagramWidth,diagramHeight,output.getBackground()); // Test rectangle
}
// Other Drawable methods omitted for brevity
};
diagram.setBounds(0,0,(int)Math.ceil(diagramWidth),(int)Math.ceil(diagramHeight));
output.setDiagram(diagram);
// Output
return output;
}
}
这里是 ImageView 的 XML 布局,它设置在 ConstraintLayout 中:
<ImageView
android:id="@+id/diagramView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="12dp"
android:layout_marginRight="12dp"
android:contentDescription="@string/diagram_description"
android:scaleType="fitCenter"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/instructionsTextView"
app:srcCompat="@android:drawable/screen_background_light" />
非常感谢您的帮助和建议。
经过反复试验,似乎解决方案——或者无论如何,一种解决方案——是为 activity 的 xml 中的 ImageView 指定 android:adjustViewBounds="true"
文件。