2016-04-07 25 views
0

私の問題は、私が何をしても、私がインターネット上で読んだ質問と答えが何であっても、私のアンドロイドデバイス画面に描画するための単純な四角形を得ることはできません。言い換えれば、それは画面上に現れますが、変わることはありません。私は更新するアニメーションを取得できません。 onDraw()は起動時に複数回、一度だけ呼び出すことはありません。どうして?ここに私のビューオブジェクトコードです:私のonDraw()メソッドは決して呼び出されません

package prospect_industries.es; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 

public class TestView extends View { 

    //Variables 
    public static final int SIZE = 300; 
    public float TOP = 0.0f; 
    public float LEFT = 0.0f; 
    public float RIGHT = 100f; 
    public float BOTTOM = 100f; 

    private Paint rectanglePaint; 
    private RectF rect1; 

    //Constructors 
    public TestView(final Context context, final AttributeSet attrs, final int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public TestView(final Context context, final AttributeSet attrs) { 
     super(context, attrs, 0); 
     init(); 
    } 

    public TestView(final Context context) { 
     super(context, null, 0); 
     init(); 
    } 

    //View methods 
    @Override 
    protected void onDraw(final Canvas canvas){ 
     canvas.drawRect(rect1, rectanglePaint); 
     Log.i("test1", "in onDraw"); 
    } 

    @Override 
    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 
     final int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
     final int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
     final int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
     final int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

     final int chosenWidth = chooseDimension(widthMode, widthSize); 
     final int chosenHeight = chooseDimension(heightMode, heightSize); 
     setMeasuredDimension(chosenWidth, chosenHeight); 
     Log.i("test1", String.valueOf(chosenWidth)); 
     Log.i("test1",String.valueOf(chosenHeight)); 
    } 

    //Class Methods 
    private int chooseDimension(final int mode, final int size) { 
     switch (mode) { 
      case MeasureSpec.AT_MOST: 
      case MeasureSpec.EXACTLY: 
       return size; 
      case MeasureSpec.UNSPECIFIED: 
      default: 
       return getDefaultDimension(); 
     } 
    } 

    private int getDefaultDimension() { return SIZE; } 

    private void init(){ 
     requestFocus(); 
     rectanglePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     rectanglePaint.setColor(-1); 
     rectanglePaint.setStyle(Paint.Style.FILL); 

     rect1 = new RectF(LEFT, TOP, RIGHT, BOTTOM); 
    } 

    public void update() { 
     RIGHT += 10; 
     BOTTOM += 10; 
     rect1 = new RectF(LEFT, TOP, RIGHT, BOTTOM); 
     invalidate(); 
     Log.i("test1", "in update"); 
    } 
} 

ここで他のものイムで作業するためのいくつかのメソッドだけでなく、私のテスト・ビュー・オブジェクトの内部でupdate()メソッドを呼び出して、タイマーを持っている私のメインクラスです。

package prospect_industries.es; 

import android.app.Activity; 
import android.content.Context; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

import java.io.IOException; 
import java.util.Random; 
import java.util.Timer; 
import java.util.TimerTask; 


public class MainActivity extends Activity { 

    private boolean setup = false; 
    public int waitDelay = 1000; //Milliseconds - currently 1 second 
    private Timer checkTime; 
    private TimerTask listen; 
    private MediaRecorder mRecorder; 

    //Splashscreen 
    private Timer splashScreen; 
    private int waitTime = 3000; //3 seconds 

    private GaugeView mGaugeView; 
    private final Random RAND = new Random(); 
    private TestView testview; 
    private SurfaceHolder surfaceHolder; 

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

     //mGaugeView = (GaugeView) findViewById(R.id.gauge_view); 
     testview = (TestView) findViewById(R.id.test_view); 
    } 


    @Override 
    public void onStart() { 
     super.onStart(); 
     //Timers 
     //1 second wait tick 
     checkTime = new Timer(); 
     checkTime.schedule(new TimerTask() { 
      public void run() { 
       MainActivity.this.runOnUiThread(new Runnable() { 
        public void run() { 
         //mGaugeView.setTargetValue(RAND.nextInt(101)); 
         testview.update(); 
        } 
       }); 
      } 
     }, 0, waitDelay); 

     //Set splash screen wait timer 
     splashScreen = new Timer(); 
     splashScreen.schedule(new TimerTask() { 
      public void run() { 
       MainActivity.this.runOnUiThread(new Runnable() { 
        public void run() { 
         setContentView(R.layout.content_main); 
        } 
       }); 
       splashScreen.cancel(); 
      } 
     }, waitTime); 

     //set welcome screen 
     setContentView(R.layout.activity_welcome); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if(checkTime != null) { 
      checkTime.cancel(); 
      stop(); 
     } 
    } 

    public void stop() { 
     if (mRecorder != null) { 
      mRecorder.stop(); 
      mRecorder.release(); 
      mRecorder = null; 
     } 
    } 

    public double getAmplitude() { 
     if (mRecorder != null) 
      return mRecorder.getMaxAmplitude(); 
     else 
      return 0; 

    } 

    public void checkSound(){ 
     if (mRecorder == null) { 
      mRecorder = new MediaRecorder(); 
      mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
      mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
      mRecorder.setOutputFile("/dev/null"); 
      try { 
       mRecorder.prepare(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      mRecorder.start(); 
     } 
    } 

    private static class MainView extends SurfaceView implements SurfaceHolder.Callback { 

     private SurfaceHolder surfaceHolder; 

     public MainView(Context context) { 
      super(context); 
      surfaceHolder = getHolder(); 
      surfaceHolder.addCallback(this); 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 

     } 
    } 
} 

最後に、テストビューオブジェクトに読み込まれるxmlレイアウトファイルを示します。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#103681" 
    tools:context="prospect_industries.es.MainActivity"> 

    <prospect_industries.es.TestView 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:id="@+id/test_view" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" /> 

</RelativeLayout> 

私は時間stackExchange超えるすべてを見てきたが、私は私の問題を解決するカントは、onDrawは再び関係なく、私は何をすべきか、一度、決して呼び出されません。今、矩形は拡大しているはずですが、再描画されません。

+0

第二及び第三TestView' 'のコンストラクタ:'スーパー(文脈、ATTRS); 'の代わりに、この'の(文脈、attrsに、0); 'と'スーパー(コンテキスト); 'の代わりに'この(コンテキスト、null、0); '。私はそう思う。 –

+0

何が起こっていないのかを考えるのではなく、何が起きているのかを確認してください。いくつかのsystem.out.printsを使用して、コンソールにコードのフローを表示します。そうすれば、どこが失敗しているのかを知ることができます。 – geostocker

+0

プログラムがインスタンス化時にonDrawを一度実行し、それがthatsであるため、私は単一のログプリントを取得しています。 –

答えて

0

問題は、長方形を幅1px、高さ1pxに初期化し、決してサイズを変更しないことです。 TestViewの左上隅の1つの白いピクセルを見ることができるはずです。

rect1のサイズを0,0,100,100に変更して、問題が解決するかどうかを確認してください。

public static final float TOP = 0.0f; 
public static final float LEFT = 0.0f; 
public static final float RIGHT = 100.0f; 
public static final float BOTTOM = 100.0f; 
+0

私はそれに気付かなかったことをほとんど恥じている。私はこれを見たはずのグラフィックスとJavaで長時間働いていました。この時点での私の唯一の成果は、実際にstackExhangeの質問を投稿することに成功したことです。ありがとうございました!私たちが顔を見て死んだときでさえ、私たちの目の前で何が見えるのか時々気づかないことがあります。 –

+0

もちろん、問題ありません!私は助けることができてうれしい:) –

+0

私は実際にはまだ1つの問題があります。私は長方形描画の変更をチェックするコードを2行追加しましたが、私の問題は実際には続きます。 onDrawは決して呼び出されません。私は自分の変更について質問を更新します。基本的には、矩形の幅と高さを追加して画像を無効にしますが、onDrawメソッドはまだ実行されません。 –

関連する問題