onDraw method not called in my application

2019-05-31 08:06发布

问题:

i am developing an application, in that onDraw() is called. i am using the following logic.

so, please guide where i did the mistake.

MainActivity

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();
  }
}

MyView class

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);

    }
  }
}

main.xml

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

回答1:

Try the below it works

To the question posted before edit.

If you're extending a ViewGroup you should override dispatchDraw() instead of onDraw().

Discussion on the topic @

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)

Called by draw to draw the child views. This may be overridden by derived classes to gain control just before its children are drawn (but after its own view has been drawn).

Parameters

canvas the canvas on which to draw the view

If you Override onDraw inthe constructor call setWillNotDraw(false) then it should work.

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); 
      }