1

カスタム ビューの onDraw() が起動されません。なんで?私は2.3.3を使用しています。ビューは作成時に自動的に描画されるべきではありませんか? onMeasure() メソッドが起動され、正しい画面の幅と高さが得られます。

package com.example.assignment2b;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.view.WindowManager;

public class AcesActivity extends Activity {

    private static final String TAG = "DEBUG";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        HeartView heartView = new HeartView(this);
        setContentView(heartView);
        heartView.invalidate();
    }


    class HeartView extends View {

        private int screenWidth;
        private int screenHeight;
        private Context context;

        public HeartView(Context context) {
            super(context);
            this.context = context;

        }

        @Override
        public void onDraw(Canvas canvas)  {
            Log.println(Log.DEBUG, TAG, "onDraw fired"); 
            int cardWidth = screenWidth - 10;
            int cardHeight = (int) (cardWidth * 1.4);


            canvas.drawColor(Color.DKGRAY);

            Paint paint = new Paint();
            paint.setColor(Color.WHITE);
            paint.setStyle(Paint.Style.FILL);
            canvas.drawRect(5, (screenHeight/2) - (cardHeight/2), screenWidth - 5, (screenHeight/2) + (cardHeight/2), paint);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.STROKE);
            canvas.drawRect(5, (screenHeight/2) - (cardHeight/2), screenWidth - 5, (screenHeight/2) + (cardHeight/2), paint);

        }

        @Override
        public void onMeasure(int width, int height) {
            Log.println(Log.DEBUG, TAG, "onMeasure fired"); 
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Display display = wm.getDefaultDisplay(); 
            screenWidth = display.getWidth();
            screenHeight = display.getHeight();
            setMeasuredDimension(screenWidth, screenHeight);
            Log.println(Log.DEBUG, TAG, "screenWidth = " + screenWidth); 
            Log.println(Log.DEBUG, TAG, "scrrenHeight = " + screenHeight); 
            super.onMeasure(screenWidth, screenHeight);
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }
}
4

2 に答える 2

1

進行中のいくつかの異なる問題。まず、@ dragonwrennが提案したように、ViewGroupとレイアウトパラメータがないと、ビューに固有の境界はありません。の呼び出しinvalidate()は不要ですが、問題はありません。

public class AcesActivity extends Activity {

    private static final String TAG = "DEBUG";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RelativeLayout rl = new RelativeLayout(this);
        RelativeLayout.LayoutParams params = new 
            RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.MATCH_PARENT);
        setContentView(rl);

        HeartView heartView = new HeartView(this);
        heartView.setLayoutParams(params);
        rl.addView(heartView);    
    }

    class HeartView extends View {

        private int screenWidth;
        private int screenHeight;
        private Context context;

         // Moved a couple of variable declarations out of the onDraw method
        Paint paint;
        int cardWidth;
        int cardHeight;

        public HeartView(Context context) {
            super(context);
            this.context = context;
            paint = new Paint();

        }

第二に、rectsの計算により、画面の境界を越えてそれらが描画されました。テストとして、いくつかの難しい数字を入れました。あなたはあなたが本当に欲しいものを得るためにあなたの数を作り直したいと思うでしょう。また、ストロークには幅がありませんでしたので、注意してください

        @Override
        public void onDraw(Canvas canvas)  {

            Log.println(Log.DEBUG, TAG, "onDraw fired"); 

            canvas.drawColor(Color.DKGRAY);

            paint.setColor(Color.WHITE);
            paint.setStyle(Paint.Style.FILL);
            canvas.drawRect(10, 10, 50, 50, paint);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(3);
            canvas.drawRect(10, 10, 50, 50, paint);

        }

第三に、onMeasureのすべてが何を達成しようとしていたかはわかりませんが、ビューに問題が発生していました。以下のもの以上は必要ありません:

        @Override
        public void onMeasure(int width, int height) {
            Log.println(Log.DEBUG, TAG, "onMeasure fired"); 
            screenWidth = width;
            screenHeight = height;

            Log.println(Log.DEBUG, TAG, "screenWidth = " + screenWidth); 
            Log.println(Log.DEBUG, TAG, "scrrenHeight = " + screenHeight); 
            super.onMeasure(screenWidth, screenHeight);
            cardWidth = screenWidth - 10;
            cardHeight = (int) (cardWidth * 1.4);
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }
}

編集:元のポスターに注意してください。上記はEclipseでテストされた関数型コードです。各セクションを正確にコピーして貼り付けると、機能します。

于 2013-02-02T04:28:58.327 に答える
0

メソッドで以下の変更を行いますonMeasure()。 クラスでディスプレイ メトリックを宣言します。 private DisplayMetrics m_metrics;

     @Override
    public void onMeasure(int width, int height) {
        Log.println(Log.DEBUG, TAG, "onMeasure fired"); 
            Display m_display = getWindowManager().getDefaultDisplay();
        m_metrics = context.getResources().getDisplayMetrics();
        m_display.getMetrics(m_metrics);
        screenWidth = m_display.getWidth();
        screenHeight = m_display.getHeight();
            super.onMeasure(screenWidth, screenHeight);
    }
于 2013-02-02T06:53:52.893 に答える