2

我现在已经删除了我的旧代码,因为它没有按我的预期工作。我试图在屏幕的某个部分使用 onDraw 画布功能,这样我的绘图周围仍然可以有按钮和其他文本。

***编辑* **

我现在已经设法解决了这个问题。很多建议很有帮助,但我无法让它与我想要的一起工作。这可能是我的错,所以感谢所有提供建议的人。这是我解决问题的方法。

*1。首先在布局文件中定义一个视图。

<view
class="com.project.MainActivity.Drawing"
android:id="@+id/drawing_area"
android:layout_width="700dp"
android:layout_height="900dp"
android:layout_centerInParent="true"/>

*2。然后使用以下代码创建一个单独的 java 类文件:

public class Drawing extends View {
Paint paint = new Paint();

public Drawing(Context context) {
super(context);
}

public Drawing(Context context, AttributeSet attrs) {
super(context, attrs);
}   

@Override
protected void onDraw(Canvas canvas) {  
super.onDraw(canvas);

//Draw Image Here//

}

*3。然后从主要活动中调用绘图:

public class MainActivity extends Activity {

private Drawing mDrawingArea;

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.percentage_count_layout);
  mDrawingArea = (Drawing)findViewById(R.id.drawing_area);  
}
4

6 回答 6

2

在您的 View 类中,您需要覆盖 onMeasure() 方法。这是您要求特定视图大小的地方。有一些关于这个主题的官方 Android 教程,一旦我在我的计算机上使用链接,我将编辑这篇文章。

编辑:

看看这篇关于创建自定义组件的 Android 文章。. 具体看一下标题为“扩展 onDraw() 和 onMeasure()”的部分。报价:

onMeasure()涉及更多一点。onMeasure()是组件与其容器之间渲染契约的关键部分。onMeasure()应该被覆盖以有效和准确地报告其包含的部分的测量值。由于父级的限制要求(传递给方法)以及在计算出测量的宽度和高度后onMeasure()调用方法的要求,这使得这稍微复杂一些。setMeasuredDimension()如果您未能从覆盖的方法调用此方法onMeasure(),则结果将在测量时出现异常。

进一步在文章中:

您的组件的onMeasure()方法应该计算渲染组件所需的测量宽度和高度。它应该尽量保持在传入的规范内,尽管它可以选择超过它们(在这种情况下,父级可以选择做什么,包括剪辑、滚动、抛出异常或要求onMeasure()重试,也许有不同的测量规范)。

有一个 CustomView 示例可用作演示,但不幸的是,开发人员网站已更改(更糟!)因此它不可用,除非通过 SDK 管理器下载。有关更多说明,请参阅此处的页面。

于 2013-01-23T17:31:43.487 回答
2

例如,200 宽,150 高。覆盖视图中的 onMeasure 方法。

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(200, 150);
    }
于 2017-11-22T08:32:09.190 回答
1

根据您的描述,问题似乎在于您没有指定 DemoView 的大小,您只是将其设置为 ContentView,默认情况下将填充父级。

在创建 DemoView 时指定一些LayoutParams ,或者创建一个 ViewGroup 来给它一个大小。

您还可以通过 XML 定义布局/调整大小,然后对其进行扩展。(在这种情况下,您应该将其设为单独的类,或者将其公开。)例如。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    Specify container measurements
    ...
    >
    <com.yourpackagename.MainActivity.DemoView
    ...
    Specify layout height / width, etc.
    ...
    />
</LinearLayout>
于 2013-01-23T17:41:48.667 回答
0

在 Android 中,您尝试执行的布局通常在 xml 中指定。这个想法是您在 xml 中设置布局(项目中的 res/ 目录中应该有一个布局目录),然后将您的代码连接到该布局。

看看这个页面。如果你向下滚动,会有一个关于布局位置、大小和填充的部分。

于 2013-01-23T17:37:39.730 回答
0

您正在使用 setContentView() 这本身意味着整个视图是全屏的。如果您希望图像仅设置为特定大小,则需要以这种方式绘制。

onDraw(Canvas canvas)
{
     super.onDraw(canvas)
     //This code is for straight centering
     //Also please do math outside of onDraw
     //also below math is pseudocode not actual android code
     canvas.drawBitmap(yourImageBitmap, 
         (screenSize.width / 2) - yourImageBitmap.width/2, 
         (screenSize.height / 2) - yourImageBitmap.height / 2),
         yourPaintObject)

    //The above code should draw your bitmap image in the center of the canvas

}

就像我上面和下面的答案一样,如果您想更改画布大小,那么您需要使用 onMeasure 并正确设置它们。您最好的选择是查看 ImageView 类的源代码http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/ ImageView.java 看看他们是怎么做的

于 2013-01-23T17:33:20.177 回答
0

这是一种您可以在视图中覆盖以获取屏幕设备信息的方法,每个设备执行一次

 @Override
public void onSizeChanged (int w, int h, int oldw, int oldh)
{
    super.onSizeChanged(w, h, oldw, oldh);
    screenW = w;
    screenH = h;

    scaledCardW = (int) (screenW/8); //or whatever scale you need for bitmaps
    scaledCardH = (int) (scaledCardW*1.28);
    bitmap = // load your bitmaps

}
于 2013-01-24T00:51:09.487 回答