如何在布局上绘制动态图形

3
我将尝试制作一个温度计。为此,我有一张温度计图片(png文件),我使用ImageView将其插入到布局中。现在我想在这个图片上绘制一条线,以显示温度读数的效果。
以下是我的代码。
main.xml
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ImageView 
</ImageView>
<com.focusone.Android.DrawExample.CustomDrawableView    
    android:id="@+id/custom_drawable_view"   
     android:layout_width="fill_parent"          
    android:layout_height="wrap_content" 
    height='100'
    /> 
</AbsoluteLayout>

DrawExample.java

package com.focusone.Android.DrawExample;

public class DrawExample extends Activity {
    /** Called when the activity is first created. */

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    }

}

CustomDrawableView.java

public class CustomDrawableView extends View {
    private ShapeDrawable mDrawable;

    public CustomDrawableView(Context v,AttributeSet as){ 
        super(v,as); 
        drawShape(as); 
    } 
    public void drawShape(AttributeSet ast) {

        int x =45; int y=15 ; int width=5; int height=0 ;
                    height= Integer.parseInt(ast.getAttributeValue(null, "height"));   
                    mDrawable = new ShapeDrawable(new RectShape());   
                    mDrawable.getPaint().setColor(0xff74AC23);   
                    mDrawable.setBounds(x, y, x + width, y + height); 
    }
   protected void onDraw(Canvas canvas) {
        mDrawable.draw(canvas);
    }
}

现在我可以使用这个程序在温度计图像上绘制一条线。但是,在运行时如何更改线的高度呢?由于xml文件中写入了height=100,我不知道该如何更改它。请有人帮帮我。

顺便问一下,你为什么不直接扩展ImageView类呢?那样的话,你就不必关心绘制图片了。你可以专注于绘制形状。 - Chris
我会尝试使用FrameLayout。首先是图片,然后是自定义视图,因为AbsoluteLayout已经过时了。要在屏幕上的任何位置放置温度计,可以通过将其顶部和左侧边距设置为RelativeLayout来将此FrameLayout插入其中。 - Lumis
2个回答

1
首先,我认为您不需要在drawShape(AttributeSet ast)中传递属性,而只需要在CustomDrawableView()构造函数中传递高度。然后,正如Chris所说,您应该在自定义视图中有另一个方法,例如:
public void setTemperature(int tmp){
  drawShape(tmp);
  invalidate(); //this will call onDraw()
}

在你的主活动中引用你的自定义视图,这样你就可以调用它的公共方法。
  CustomDrawableView temperatureView = 
                  (CustomDrawableView) findViewById(R.id.custom_drawable_view);

  temperatureView.setTemperature(50);

为什么要将 setTemperature 设为静态方法呢?在我看来,这没有任何意义。当然,你可以说只会绘制一个温度值。但是如果你想再绘制另一个温度值呢?那么 instance 变量也就变得无关紧要了... - Atmocreations
你是对的,在这里没有必要使用静态方法来复杂化。 - Lumis

1

你可以:

  • 将“height”作为你的CustomDrawableView的成员变量。
  • 然后创建一个方法setHeight(int height),在其中更改高度的值。
  • 接着在你的活动中使用(CustomDrawableView)findViewById(R.id.custom_drawable_view)来获取对你的视图对象的引用。
  • 最后通过调用setHeight(x)来随意更改高度的值。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接