线性布局内的Android自定义视图与其他视图

Posted

技术标签:

【中文标题】线性布局内的Android自定义视图与其他视图【英文标题】:Android Custom View inside Linear Layout with other views 【发布时间】:2015-09-23 11:05:04 【问题描述】:

我有一个自定义视图来显示一个简单的饼图。 我的意图是通过布局 xml 文件获取一些值,例如大小、背景颜色等。 我将圆的半径、笔画宽度等作为 视图高度的因素(宽度等于父/屏幕的宽度),所有尺寸都基于此半径。

这是我的片段布局 xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_
android:layout_
android:background="@color/bluegrey200"
tools:context="ash.dbtest.GraphpieChartFragment">

    <ash.dbtest.GraphPieChartView
        android:layout_
        android:id="@+id/pieChart1"
        custom:backgroundColor="@color/bluegrey800"
        custom:labelColor="@color/white"
        android:layout_
        />

现在看起来非常好。

看图:

黑色矩形是被覆盖的 onDraw 方法中使用的区域。注意显示矩形边界的蓝色对角线。 我知道高度以像素为单位,它必须以 dp 为单位;但这些值现在用于调试目的。

我将布局 xml 文件更改为下方,以便在另一个线性布局中的自定义视图上方添加横幅。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_
android:layout_
android:background="@color/bluegrey200"
tools:context="ash.dbtest.GraphPieChartFragment">
<LinearLayout
    android:layout_
    android:orientation="horizontal"
    android:layout_>
    <TextView
        android:layout_
        android:text="TestBanner"
        android:textSize="20sp"
        android:layout_ />
    </LinearLayout>
    <ash.dbtest.GraphPieChartView
        android:layout_
        android:id="@+id/pieChart1"
        custom:backgroundColor="@color/bluegrey800"
        custom:labelColor="@color/white"
        android:layout_
        />

现在看截图,很奇怪。

在此处查看图片:

现在我的自定义视图移动到底部,但被截断了。 onDraw 方法获得了正确的尺寸,并且正确地绘制了圆。但不知何故,视图被截断了。在下面的屏幕截图中,请注意黑色矩形不完整蓝色对角线被截断。 可能是什么问题? 我是 android 的初学者,希望我已经提供了所有必需的信息。我没有发布代码,因为它只是画布上的基本绘制。 非常感谢您花时间在这方面。

GraphPieCharView.onDraw 上的代码

  @Override
public void onDraw(Canvas canvas) 

    Log.d("onDraw","onDraw");
    Log.d("onDraw1",Float.toString(this.getLeft()));
    Log.d("onDraw2",Float.toString(this.getTop()));
    Log.d("onDraw3",Float.toString(this.getRight()));
    Log.d("onDraw4",Float.toString(this.getBottom()));
    paint.setAntiAlias(true);
    paint.setFilterBitmap(true);
    paint.setStrokeWidth(20);
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(BACKGROUND_COLOR);
    canvas.drawRect(this.getLeft(),this.getTop(),this.getRight(),this.getBottom(),paint);

【问题讨论】:

【参考方案1】:

因为您的 GraphPieChartView 在 TextView 下方

【讨论】:

GraphPieChartView 低于 TextView,这是预期的。我的问题是为什么 Rectangle 会被截断。我的 onDraw 方法中的代码要点已添加到问题中【参考方案2】:

想通了。 我正在使用下面的代码绘制矩形 canvas.drawRect(this.getLeft(),this.getTop(),this.getRight(),this.getBottom(),paint);

假设页面高 1500 像素,宽 1000 像素。 在这里,当 customview 是页面上的唯一视图时,下面是 getter 的结果。 左 - 0 顶部 - 0 对 - 1000 底部 - 800

我在这些边界内绘制了矩形,所有的计算都基于这些边界;它工作得很好。

现在,当自定义视图是垂直列出的第二个视图时,顶部的 TextView 占 50px,

左 - 0 前 50 名 对 - 1000 底部 - 850

但是这些值是相对于整个屏幕的(1000*1500)。 但在我的自定义视图中,我拥有的画布是 1000*800,从 0,0 开始,到对角线 1000,800 结束。 但是我在画布上绘图,好像它从 0,50 开始,到 1000,850 结束。

将 onDraw 方法中的计算调整为始终从 0,0 开始,并解决了该问题。

感谢所有回复。

【讨论】:

您的解决方案的问题是它不适用于其他尺寸的屏幕(例如 480*800)。你打算只发布 1000*1500 屏幕吗? - 你应该使用 'getMeasured...()' 然后调整 'drawRect()' 的值。

以上是关于线性布局内的Android自定义视图与其他视图的主要内容,如果未能解决你的问题,请参考以下文章

线性布局android中的重叠视图

自定义 Android 视图在线性和相对布局中显示不同

ScrollView 内的 Android WebView 仅滚动滚动视图

具有特定形状的 Android 自定义视图

如何实现在动态布局中添加更多视图在android中实现滚动视图

列表视图自定义行