【问题标题】:Redraw canvas in Android在 Android 中重绘画布
【发布时间】:2011-08-18 12:39:59
【问题描述】:

我正在使用 Eclipse 制作一个 Android 2.2 应用程序。我的应用程序应该绘制 图像通过点击按钮。

我在屏幕底部有两个按钮,我需要在有按钮的同一个屏幕上绘制形状。我使用了FrameLayout 来绘制形状。

我的问题是,这两个形状被覆盖,所以我需要重新绘制画布。

我的代码

package draw.tab;

import android.app.Activity;
//import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;

public class DrawActivity extends Activity implements OnClickListener
{
    DrawView drawview;
    CircleView circleView;
    FrameLayout Frame;
    Button square,circle;

    /** Called when the activity is first created. */

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

        Frame=(FrameLayout)findViewById(R.id.MyFrame);      
        drawview=new DrawView(this);
        circleView=new CircleView(this);

        square=(Button)findViewById(R.id.buttonTest);
        square.setOnClickListener(this);
        circle=(Button)findViewById(R.id.circleButton);
        circle.setOnClickListener(this);
    }

    public void onClick(View v)
    {
        switch (v.getId()) {
            case R.id.circleButton:
                Frame.addView(circleView);
                /*circleView.setBackgroundColor(Color.rgb(40,100,20));
                circleView.findViewById(R.id.CircleViewId);
                setContentView(circleView);*/
                break;
            case R.id.buttonTest:
                Frame.addView(drawview);
                /*drawview.setBackgroundColor(Color.WHITE);
                drawview.findViewById(R.id.DrawViewId);
                drawview.layout(400,0,200,450);
                setContentView(drawview);*/
                break;
        }
    }
}

DrawView.java

package draw.tab; 

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

public class DrawView extends View
{
    Paint paint=new Paint();
    Path pat=new Path();

    public DrawView(Context context) 
    {
        super(context);
        paint.setColor(Color.RED);
        paint.setStyle(Style.STROKE);
        //context.clearRect(70,140,400,450);
        //pat.addRect(50,40,250,400,Path.Direction.CW);
    }

    public DrawView(Context con,AttributeSet atts)
    {
        super(con,atts);
    }

    @Override
    public void onDraw(Canvas canvas) 
    {       
        //canvas.drawPath(pat,paint);
        canvas.drawLine(20,40,450,40,paint);//horizontal top            
        canvas.drawRect(70,140,400,450,paint);
        canvas.drawLine(20,40,20,600,paint);//vertical left
        canvas.drawLine(20,600,450,600,paint);//horizontal bottom
        canvas.drawLine(450,40,450,600,paint);//vertical right
        //this.invalidate();
    }
}

CircleView.java

package draw.tab;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

public class CircleView extends View
{
    Paint p=new Paint();
    Path path=new Path();

    public CircleView(Context context)
    {
        super(context);
        p.setColor(Color.BLUE);
        p.setStyle(Style.STROKE);
        //path.addCircle(250,250,50,Path.Direction.CW);
    }

    public CircleView(Context con,AttributeSet atts)
    {
        super(con,atts);
    }

    public void onDraw(Canvas c)
    {
        //c.drawPath(path,p);
        //c.save();
        c.drawLine(20,40,450,40, p);//horizontal top
        c.drawCircle(250,350,100,p);
        c.drawLine(20,40,20,600,p);//vertical left
        c.drawLine(20,600,450,600,p);//horizontal bottom
        c.drawLine(450,40,450,600,p);//vertical right
        //c.restore();
        this.invalidate();
    }
}

ma​​in.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:visibility="visible"
    android:id="@+id/MyFrame"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <draw.tab.DrawView
    android:id="@+id/DrawViewId"
    android:layout_width="320dp"
    android:layout_height="600dp">
    </draw.tab.DrawView>

    <draw.tab.CircleView
    android:id="@+id/CircleViewId"
    android:layout_width="320dp"
    android:layout_height="600dp">
    </draw.tab.CircleView>

<LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:gravity="bottom">

     <Button 
        android:layout_height="wrap_content" 
        android:text="Circle" 
        android:id="@+id/circleButton" 
        android:layout_width="160dp">
    </Button>

    <Button 
        android:layout_height="wrap_content" 
        android:text="Square" 
        android:id="@+id/buttonTest" 
        android:layout_width="160dp">
    </Button>
</LinearLayout>

</FrameLayout>

以上是我的全部代码。形状被覆盖,所以我想删除并重绘画布或重绘而不覆盖。

【问题讨论】:

    标签: android android-2.2-froyo


    【解决方案1】:

    尝试在您的视图上调用 invalidate()。

    【讨论】:

      【解决方案2】:

      致电canvas.save(),然后进行绘图,然后致电canvas.restore()。还取决于您正在绘制的位图。位图应具有透明背景。

      编辑

      在绘制位图之前调用canvas.drawColor(Color.White); //Or whichever bg color

      编辑

      drawview 试试这个

      canvas.drawRect(getLeft(), getTop(), getright() , getBottom() ,paint);
      

      类似CircleView

      canvas.drawCircle(getLeft()+getwidth()/2, getTop()+getheight()/2, 100, paint);
      

      最后一次尝试。设置儿童重力..

      <draw.tab.DrawView
      android:id="@+id/DrawViewId"
      android:layout_width="320dp"
      android:layout_height="600dp"
      android:layout_gravity="left">
      </draw.tab.DrawView>
      
      <draw.tab.CircleView
      android:id="@+id/CircleViewId"
      android:layout_width="320dp"
      android:layout_height="600dp"
      android:layout_gravity="right">
      </draw.tab.CircleView>
      

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 2012-11-01
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 2022-12-19
        相关资源
        最近更新 更多