1

我正在开发一个应用程序,其中 onDraw() 被调用。我正在使用以下逻辑。

所以,请指导我在哪里做错了。

主要活动

public class Hello extends Activity implements SensorListener
{
  private MyView myView;
  private SensorManager sensorManager;

  public void onAccuracyChanged(int paramInt1, int paramInt2)
  {
  }

  public void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    Log.e("hello", "hello");
    this.myView = new MyView(this);
    setContentView(this.myView);
    this.sensorManager = ((SensorManager)getSystemService("sensor"));
    this.myView.setTheme(2);
  }

  protected void onResume()
  {
    super.onResume();
    this.sensorManager.registerListener(this, 3, 0);
  }

  public void onSensorChanged(int paramInt, float[] paramArrayOfFloat)
  {
    switch (paramInt)
    {
    default:
    case 1:
    case 2:
    }
    this.myView.resetTama();
    do
    {
      do
        return;
      while (Math.abs(paramArrayOfFloat[2]) <= 50.0F);
    }
    while (Math.abs(paramArrayOfFloat[0]) <= 15.0F);

  }

  public void onWindowFocusChanged(boolean paramBoolean)
  {
    super.onWindowFocusChanged(paramBoolean);
    if (paramBoolean)
      this.myView.init();
  }
}

我的视图类

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import java.lang.reflect.Array;

public class MyView extends RelativeLayout
{
  private final int FP = -1;
  private final int WC = -2;
  public boolean disableApplication = false;
  private int imgType = 1;
  public boolean isBlack = false;
  boolean isInitialized;
  private Bitmap myBitmap;
  private Paint myPaint = new Paint();
  private int[] numbers;
  private Tama[] oyatamaArray;
  private Tama[][] tamaArray;

  public MyView(Context paramContext)
  {
    super(paramContext);
    Log.e("MyView", "MyView");
    setFocusable(true);
    setBackgroundResource(R.drawable.haikei);
    setWillNotDraw(false); 
    this.myBitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.tama);
    this.numbers = new int[6];


    for (int i = 0; i<numbers.length; i++)
    {
      if (i >= this.numbers.length)
      {
        loadChangeThemeButton(paramContext);
        new TextView(paramContext).setBackgroundResource(R.drawable.bar);
        return;
      }
      this.numbers[i] = 0;
    }
  }

  private void changeBackgroundImage()
  {
    int i = 1 + this.imgType;
    this.imgType = i;
    if (i > 3)
      this.imgType = 1;
    setTheme(this.imgType);
  }

  private void loadChangeThemeButton(Context paramContext)
  {
    ImageButton localImageButton = new ImageButton(paramContext);
    localImageButton.setBackgroundResource(R.drawable.themebutton);
    RelativeLayout.LayoutParams localLayoutParams = new RelativeLayout.LayoutParams(-2, -2);
    localLayoutParams.addRule(9);
    localLayoutParams.addRule(12);
    localLayoutParams.setMargins(0, 0, 30, 30);
    addView(localImageButton, localLayoutParams);
    localImageButton.setOnClickListener(new View.OnClickListener()
    {
      public void onClick(View paramView)
      {
        MyView.this.changeBackgroundImage();
      }
    });
  }

  private Bitmap returnNumberImg(Resources paramResources, int paramInt)
  {
    switch (paramInt)
    {
    default:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n0);
    case 1:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n1);
    case 2:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n2);
    case 3:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n3);
    case 4:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n4);
    case 5:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n5);
    case 6:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n6);
    case 7:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n7);
    case 8:
      return BitmapFactory.decodeResource(paramResources, R.drawable.n8);
    case 9:
    }
    return BitmapFactory.decodeResource(paramResources, R.drawable.n9);
  }

  private void settingTamasTouchX(int paramInt1, int paramInt2)
  {
    int i = 0;
    if (i >= this.oyatamaArray.length);
    int k;
    for (int j = 0; ; j++)
    {
      if (j >= this.tamaArray.length)
      {
        return;
      }
      k = 0;
      if (k < this.tamaArray[j].length)
      {
          if (this.tamaArray[j][k].checkArea(paramInt1, paramInt2));
            for (this.tamaArray[j][k].touchX = paramInt1; ; this.tamaArray[j][k].touchX = 0)
            {
              k++;
              break;
            }
//        break label90;
      }
    }
  }

  public void init()
  {
    int i = getHeight() / 7;
    int[] arrayOfInt = new int[6];
    int j = 5;
    if (j < 0)
      this.oyatamaArray = new Tama[6];
    int m;
    int i1 = 0;
    for (int k = 0; ; k++)
    {
      if (k >= this.oyatamaArray.length)
      {
        this.tamaArray = ((Tama[][])Array.newInstance(Tama.class, new int[] { 6, 4 }));
        m = 0;
        if (m < this.tamaArray.length)
        {

            for (int n = 0; ; n++)
            {
              if (n >= this.tamaArray[m].length)
              {
                m++;
                break;
              }
              this.tamaArray[m][n] = new Tama(40 + n * 37, arrayOfInt[m] - 32, n + m * 10);
            }
//          break label154;
        }
        i1 = 0;
        if (i1 < this.tamaArray.length)
        {
            for (int i2 = 0; ; i2++)
            {
              if (i2 >= this.tamaArray[i1].length)
              {
                i1++;
                break;
              }
              if (i2 != this.tamaArray[i1].length - 1)
                this.tamaArray[i1][i2].ueTama = this.tamaArray[i1][(i2 + 1)];
              if (i2 == 0)
                continue;
              this.tamaArray[i1][i2].shitaTama = this.tamaArray[i1][(i2 - 1)];
            }
//          break label222;
        }
        this.isInitialized = true;
        return;
      }
      this.oyatamaArray[k] = new Tama(279, arrayOfInt[k] - 32, k);
      this.oyatamaArray[k].isOya = true;
    }
  }



  @Override
  protected void dispatchDraw(Canvas canvas){         

        super.dispatchDraw(canvas);     
        Log.e("......this.........","drawing");   
    }


@Override
  protected void onDraw(Canvas paramCanvas)
  {

      super.onDraw(paramCanvas);


      Log.e("This on draw","....yes");

    if (!this.isInitialized)
      init();
    int i = 0;
    Resources localResources;
    int m;
    while (true)
    {
      int j;
      if (i >= this.oyatamaArray.length)
      {
        j = 0;
        if (j >= this.tamaArray.length)
        {
          localResources = getContext().getResources();
          m = 0;
          if (m < 7)
            break;
          return;
        }
      }
      else
      {
        paramCanvas.drawBitmap(this.myBitmap, this.oyatamaArray[i].getX(), this.oyatamaArray[i].getY(), this.myPaint);
        i++;
        continue;
      }
      for (int k = 0; ; k++)
      {
        if (k >= this.tamaArray[j].length)
        {
          j++;
          break;
        }
        paramCanvas.drawBitmap(this.myBitmap, this.tamaArray[j][k].getX(), this.tamaArray[j][k].getY(), this.myPaint);
      }
    }
    if (this.numbers.length <= m)
    {
    for (Bitmap localBitmap = BitmapFactory.decodeResource(localResources, 2130837523); ; localBitmap = returnNumberImg(localResources, this.numbers[m]))
    {
      paramCanvas.drawBitmap(localBitmap, 8.0F, getHeight() / 2 + m * 18, this.myPaint);
      m++;
      break;
    }
    }
  }

  public boolean onTouchEvent(MotionEvent paramMotionEvent)
  {
    int i = (int)paramMotionEvent.getX();
    int j = (int)paramMotionEvent.getY();
    if ((paramMotionEvent.getAction() == 0) && (i >= 0) && (i <= 40) && (410 <= j) && (j <= 430))
      changeBackgroundImage();
    if (paramMotionEvent.getAction() == 0)
      settingTamasTouchX(i, j);
    if (1 == paramMotionEvent.getAction())
      settingTamasTouchX(0, 0);
    int k;
    int m = 0;
    if (2 == paramMotionEvent.getAction())
    {
      k = 0;
      if (k >= this.oyatamaArray.length)
      {
        m = 0;
        if (m < this.tamaArray.length)
        {
            for (int n = 0; ; n++)
            {
              if (n >= this.tamaArray[m].length)
              {
                m++;
                break;
              }
              this.tamaArray[m][n].checkAndSetArea(i, j);
              if (!this.tamaArray[m][n].isUp)
                continue;
              int[] arrayOfInt = this.numbers;
              arrayOfInt[m] = (1 + arrayOfInt[m]);
            }
//          break label164;
        }
        invalidate();
      }
    }
    else
    {
      return true;
    }
    this.oyatamaArray[k].checkAndSetArea(i, j);
    if (this.oyatamaArray[k].isUp)
      this.numbers[k] = 5;
    while (true)
    {
      k++;
      break;
    }
//    label164: 
    return disableApplication;
  }

  public void resetTama()
  {
    int j;
    for (int i = 0; ; i++)
    {
      if (i >= this.oyatamaArray.length)
      {
        j = 0;
        if (j < this.tamaArray.length)
          break;
        invalidate();
        return;
      }
      this.oyatamaArray[i].moveX(this.oyatamaArray[i].startX);
      this.oyatamaArray[i].isUp = false;
      this.numbers[i] = 0;
    }
    for (int k = 0; ; k++)
    {
      if (k >= this.tamaArray[j].length)
      {
        j++;
        break;
      }
      this.tamaArray[j][k].moveX(this.tamaArray[j][k].startX);
      this.tamaArray[j][k].isUp = false;
    }
  }

  public void sensorChange(float[] paramArrayOfFloat)
  {
    int i = 0;
    if (paramArrayOfFloat[2] < -50.0F)
      i = 0 - 3;
    int k;
    while (true)
    {
      int j = 0;
      if (j >= this.oyatamaArray.length)
      {
        k = 0;
        if (k < this.tamaArray.length)
          break;
        if (i != 0)
          invalidate();
        return;
      }
      else
      {
        this.oyatamaArray[j].moveX(i + this.oyatamaArray[j].getX());
        if (this.oyatamaArray[j].isUp)
          this.numbers[j] = 5;
        while (true)
        {
          j++;
          break;
        }
      }
    }
    for (int m = 0; ; m++)
    {
      if (m >= this.tamaArray[k].length)
      {
        k++;
        break;
      }
      this.tamaArray[k][m].moveX(i + this.tamaArray[k][m].getX());
      if (!this.tamaArray[k][m].isUp)
        continue;
      int[] arrayOfInt = this.numbers;
      arrayOfInt[k] = (1 + arrayOfInt[k]);
    }
  }

  public void setTheme(int paramInt)
  {
    Resources localResources = getContext().getResources();
    if (paramInt == 1)
    {
      this.myBitmap = BitmapFactory.decodeResource(localResources, R.drawable.tama);
      setBackgroundResource(R.drawable.haikei);
    }
    while (true)
    {
      invalidate();
//      return;
      if (paramInt == 2)
      {
        this.myBitmap = BitmapFactory.decodeResource(localResources, R.drawable.tama2);
        setBackgroundResource(2130837510);
        continue;
      }
      this.myBitmap = BitmapFactory.decodeResource(localResources, R.drawable.tama3);
      setBackgroundResource(2130837510);

    }
  }
}

主要的.xml

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@id/FrameLayout01" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
   />
4

1 回答 1

1

试试下面它的工作原理

对于编辑前发布的问题。

如果您要扩展 ViewGroup,则应覆盖dispatchDraw()而不是onDraw().

话题讨论@

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/oLccWfszuUo

public class Hello  extends Activity {

    private MyView myView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

                super.onCreate(savedInstanceState);
                Log.e("hello", "hello");
                this.myView = new MyView(this);
                setContentView(this.myView);

    }
     public class MyView extends RelativeLayout
       {

      private Paint myPaint = new Paint();
      private int[] numbers;
      public MyView(Context paramContext)
      {
        super(paramContext);
        Log.e("MyView", "MyView");
        setFocusable(true);
        setBackgroundResource(R.drawable.ic_launcher);
      }
      @Override
      protected void dispatchDraw(Canvas canvas){         

            super.dispatchDraw(canvas);     
            Log.i("...............","drawing");   
        }

  }
}

protected void dispatchDraw (Canvas canvas)

由 draw 调用以绘制子视图。这可能会被派生类覆盖,以便在绘制其子级之前(但在绘制其自己的视图之后)获得控制权。

参数

canvas 绘制视图的画布

如果您onDraw在构造函数调用中覆盖,setWillNotDraw(false)那么它应该可以工作。

http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)

public MyView(Context paramContext)
      {
        super(paramContext);
        Log.e("MyView", "MyView");
        setFocusable(true);
        setBackgroundResource(R.drawable.ic_launcher);
        setWillNotDraw(false); 
      }
于 2013-07-03T06:35:20.717 回答