我在应用程序屏幕上定位自定义视图时遇到问题。 我想覆盖onDraw方法,以便它'知道'在哪里绘制,如“android:layout_alignParentLeft”中所指定的那样。 目前它吸引了marginLeft和marginTop,无论我的'坦克'在哪里。 我有什么想法可以解决这个问题吗?
XML文件:
<ImageView
android:id="@+id/tank"
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_marginLeft="150dp"
android:layout_marginTop="10dp"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:src="@drawable/tank" />
<pl.edu.agh.scada.graphicalObjects.AnalogBar
android:id="@+id/analogBar"
android:layout_width="25dp"
android:layout_height="200dp"
android:layout_toLeftOf="@+id/tank"
android:layout_toStartOf="@+id/tank"
android:layout_marginLeft="100dp"
android:layout_marginTop="15dp"
custom:editable="true"/>
我班级的一部分检索有关自定义视图的信息:
int width;
int height;
public AnalogBar(Context context, AttributeSet attrs) {
super(context, attrs);
boolean editable;
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.AnalogBar, 0, 0);
if (!isInEditMode())
parentView = ((MainActivity) context).fragment;
try {
editable = a.getBoolean(R.styleable.AnalogBar_editable, false);
//I deleted everything else regarding custom properties
} finally {
a.recycle();
}
if (editable)
this.setOnClickListener(new WriteRegisterListener());
init();
}
public void init() {
if (!isInEditMode())
parentView.addViewToList(this);
要在屏幕上放置布局后获取有关布局的信息,我会覆盖:
public void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width = w;
height = h;
我尝试了不同的功能:getX(),getLocationOnScreen() 但它仍然写在marginLeft和marginTop中保存的绝对位置。 有没有办法获取在与toLeftOf和toStartOf相关的位置绘制视图所需的信息?
幸运的是我设法做到了。
我怀疑我必须以某种方式检索布局的位置。事实证明,当您在左侧的“0”位置绘制视图时,它位于布局的最左端。
这样就可以正确地进行参数化
android:layout_alignBottom="@+id/tank"
android:layout_alignLeft="@+id/tank"
android:layout_marginBottom="45dp"
android:layout_marginLeft="75dp"
您可以在自定义视图的绘制位置绘制。 例如,如果要用矩形填充所有视图,则必须检索其大小(就像我在onSizeChanged中所做的那样),然后使用canvas.drawRect(0,0,width,height,border)绘制矩形;
我不知道为什么但是这些参数(alignBottom&amp; alignLeft)似乎比toLeftOf和toEndOf更好。 这些参数之间有什么区别?
答案 0 :(得分:0)
视图在边距之后开始,并绘制考虑填充的子视图(作为子项的内边距)。 在这种情况下,如果您希望将视图绘制为与父项左侧对齐,则不应使用以下内容布置自定义视图:
android:layout_marginLeft="100dp"
除非您确实想要在父视图和视图之间留出空格。
另一件事是您设置自定义视图相对于坦克的位置:
android:layout_toLeftOf="@+id/tank"
android:layout_toStartOf="@+id/tank"
所以你可以试试:
android:layout_alignParentLeft="true"
希望它有所帮助。