Android:定义onDraw画布大小

时间:2013-01-23 17:12:25

标签: android android-layout android-canvas ondraw

我已经删除了我的旧代码,因为它没有像我预期的那样工作。我试图在屏幕的某个部分使用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。然后从主要活动中调用Drawing:

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 个答案:

答案 0 :(得分:2)

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

编辑:

看看这个Android article about creating custom components.。具体来看看标题为“Extend onDraw()和onMeasure()”的部分。引用:

  

onMeasure()更多参与其中。 onMeasure()是至关重要的   组件与其组件之间的渲染合同的一部分   容器。应该有效地覆盖onMeasure()   准确报告其所包含部件的测量结果。这是   由于限制的要求,使得稍微复杂一些   parent(传递给onMeasure()方法)和   需要使用。调用setMeasuredDimension()方法   计算出的宽度和高度。如果你失败了   从重写的onMeasure()方法调用此方法,   结果将是测量时的例外。

在文章中进一步说明:

  

组件的onMeasure()方法应计算渲染组件所需的测量宽度和高度。它   应尽量保持在中传递的规范内,尽管如此   可以选择超过它们(在这种情况下,父母可以选择要做什么   做,包括剪辑,滚动,抛出异常或询问   onMeasure()再试一次,也许会有不同的衡量标准   规格)。

有一个CustomView示例可用作演示,但遗憾的是开发人员网站已经更改(更糟糕!),因此除了通过SDK Manager下载之外,它不可用。有关详细说明,请参阅页面here

答案 1 :(得分: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的源代码 并看看他们是如何做到的

答案 2 :(得分: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

}

答案 3 :(得分:0)

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(200, 150);
    }