2

Fragment 内の Canvas で線を引こうとしています。いくつかの調査の結果、View クラスを拡張して onDraw をオーバーライドし、通常はレイアウトを拡張する新しい View クラスのインスタンスを返すだけでよいことがわかりました。ただし、デバイスでフラグメントにアクセスすると、白い画面しか表示されません。これが私がこれまでに持っているものです:

package com.example.testing;

import android.app.Fragment;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class LineTab extends Fragment 
{       

    private class DrawView extends View {
        Paint paint = new Paint();

        public DrawView(Context context) {
            super(context);
            paint.setColor(Color.BLACK);
        }
        public DrawView(Context context, AttributeSet attrs) {
            super(context, attrs);
            paint.setColor(Color.BLACK);
        }
        public DrawView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            paint.setColor(Color.BLACK);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            canvas.drawLine(0, 0, 50, 50, paint);
            canvas.drawLine(50, 0, 0, 50, paint);
        }

        @Override 
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
            int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
            this.setMeasuredDimension(parentWidth, parentHeight);
        }
    }   

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        return new DrawView(this.getActivity());
    }
}

ここで何が欠けていますか?

編集:この問題に直面している他の人にとって、このコードは正常に機能することが判明しました。アクティビティ内での表示に問題がありました。

4

1 に答える 1

2

独自のタイプのウィジェットを作成するときに必要ないくつかのこと:

  • ビューのサイズは?と のいずれかまたは両方を上書きする必要がありonMeasureますonLayout。に何を入れるべきかを示すウィジェットのカスタマイズのガイドを確認してくださいonMeasure

  • 3 つのコンストラクターすべてを上書き/実装します。これは、XML 経由で膨張しない場合、よりオプションのようなものです。しかし、そうするのは良いスタイルです。

これにより、少なくとも一歩前進するはずです。たぶん、そのコードには他の問題があります。どれどれ。

EDIT : 2 番目の方法は、 aDrawableと a 通常ImageViewを使用して画面に描画することです。これはより直接的で、コーディングに必要な行数がはるかに少なくなります。

画面に ImageView を配置する XML を次に示します。を定義していないことに注意してくださいandroid:src

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/drawLineImageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFFFFFFF" />

</FrameLayout>

これで、ドローアブルをコーディングして ImageView に接続できます。

public class DrawLineActivity extends Activity {
/* (non-Javadoc)
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.draw_line);

    // Create a simple drawable and set it in the ImageView
    ((ImageView) findViewById(R.id.drawLineImageView)).setImageDrawable(new MyDrawable());
}

private class MyDrawable extends Drawable {
    @Override
    public void draw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawLine(0, 0, 50, 50, paint);
        canvas.drawLine(50, 0, 0, 50, paint);
    }

    @Override
    public int getOpacity() {return 0;}

    @Override
    public void setAlpha(int alpha) {}

    @Override
    public void setColorFilter(ColorFilter cf) {}
}
}
于 2013-11-11T18:36:01.123 に答える