我有一个自定义视图来显示一个简单的饼图 我的目的是通过布局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_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bluegrey200"
tools:context="ash.dbtest.GraphPieChartFragment">
<ash.dbtest.GraphPieChartView
android:layout_width="match_parent"
android:id="@+id/pieChart1"
custom:backgroundColor="@color/bluegrey800"
custom:labelColor="@color/white"
android:layout_height="800px"
/>
现在看起来非常好。
见图片:
黑色矩形是重写的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_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bluegrey200"
tools:context="ash.dbtest.GraphPieChartFragment">
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:text="TestBanner"
android:textSize="20sp"
android:layout_height="wrap_content" />
</LinearLayout>
<ash.dbtest.GraphPieChartView
android:layout_width="match_parent"
android:id="@+id/pieChart1"
custom:backgroundColor="@color/bluegrey800"
custom:labelColor="@color/white"
android:layout_height="800px"
/>
现在看截图,很奇怪。
见图:
现在我的自定义视图移到了底部,但是被截断了。 onDraw方法获得了正确的尺寸,圆圈正在被绘制。但不知何故,View被截断了。在下面的屏幕截图中,请注意黑色矩形不完整,蓝色对角线被截断。
可能是什么问题?
我是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);
答案 0 :(得分:0)
因为GraphPieChartView位于TextView
之下答案 1 :(得分:0)
如果你想确保视图适合设备的屏幕,你必须调用&#34; getMeasuredWidth()&#34;和&#34; getMeasuredHeight()&#34;在自定义视图&#34; onDraw()&#34;方法并根据结果缩放视图。
另见the Reference for these methods
除此之外,最好手动设置矩形左上角的坐标 - 你知道你希望它们是(0,0)而不是&#39; getTop()& #39;出于某种原因的方法给了我28.0(状态栏的高度?但为什么在这里?)
首先删除
从布局文件中机器人:layout_height =&#34; 800像素&#34;
然后编写
AssertionError: Calls not found.
Expected: [call.derived_method_1st(), call.derived_method_2nd(), call.derived_method_3rd()]
Actual: [call.run_this()]
沿着View的边缘有一个矩形。请注意,只有一半的绘制边框显示,换句话说,一半的笔触宽度在矩形边界之外,因此不可见。所以也许你必须使用第二个canvas.drawRect(0,0,this.getMeasuredWidth(),getMeasuredHeight(),paint);
作为内线。
答案 2 :(得分:0)
想出来。
我正在使用下面的代码绘制矩形
canvas.drawRect(this.getLeft(),this.getTop(),this.getRight(),this.getBottom(),paint);
让我们说这个页面是1500px高和1000px宽。 这里,当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开始,它解决了问题。
感谢所有回复。