11

Android でキャンバスに描画された項目をスクロールする基本を理解する助けが必要です。0 の時間がビジュアライゼーションの一番上にあり、時間の経過とともにタイムラインが前のポイントよりも下にレンダリングされ続けるタイムラインを作成するとします。これを Android でレンダリングしたい場合は、onDraw() をオーバーライドすることで、キャンバス上に一連のアイテムを簡単に作成できることがわかっています。ただし、ビジュアライゼーションが画面の許容範囲を超えているとします。

たとえば、下の最初の図では、レンダリングしたキャンバス全体が大きな黒いボックスに含まれています。縦に上下に走る青い線と、黄色、緑、青の長方形をいくつか作成します。赤いボックスは、視覚化をレンダリングしている Android の画面を表しています。最初に開くと、すべてのアイテムが描画されますが、赤いボックス内に含まれるアイテムのみが画面に表示されます。

Before_Scroll

ユーザーが下にスクロールすると、2 番目の図に示すように、最初に赤いボックスの下に表示されていたアイテムが表示され、赤いボックスの範囲外に出たアイテムは表示されなくなります。

After_Scroll

スクロール可能を使用する必要があると思いますが、その方法がまったくわかりません。このページhttp://developer.android.com/training/custom-views/custom-drawing.htmlを読み 、独自の顧客画像を作成する方法を説明し、このページhttp://developer.android.com/trainingを読みました/custom-views/making-interactive.htmlで UI をインタラクティブにする方法を説明していますが、何か足りないと思います。

この問題を説明するサンプル コードは次のとおりです (これは基本的なものであり、ボックス/ラインの移動先などを指示するロジックがあると仮定します)。

package com.example.scrolltest;

import com.example.scrolltest.Draw;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;

public class MainActivity extends Activity {
    Draw draw;

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

    draw = new Draw(this);
    draw.setBackgroundColor(Color.WHITE);
    setContentView(draw);
    }
}

package com.example.scrolltest;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;


public class Draw extends View {
    Paint paint = new Paint();

    public Draw(Context context) {
        super(context);            
    }

    @Override
    public void onDraw(Canvas canvas) {

        paint.setColor(Color.GREEN);
        canvas.drawRect(30, 30, 90, 200, paint);
        paint.setColor(Color.BLUE);

        canvas.drawLine(100, 20, 100, 1900, paint);

        paint.setColor(Color.GREEN);
        canvas.drawRect(200, 2000, 400, 3000, paint);
        }
}

私が理解できないのは、スクロール可能なものを使用して、画面の外にある長方形までスクロールする方法です。また、これを正しく開始したのか、代わりにドローアブルを使用する必要があるのか​​ もわかりません...

4

2 に答える 2

21

簡単な方法 (必要な高さがそれほど大きくない場合)。

ScrollView を使用して、それに Draw ビューを追加します。そのビューに必要な高さを onMeasure で計算します。

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

draw = new Draw(this);
draw.setBackgroundColor(Color.WHITE);
ScrollView scrollView = new ScrollView(this);
scrollView.addView(draw);
setContentView(scrollView);
}

public class Draw extends View {
        Paint paint = new Paint();

        public Draw(Context context) {
            super(context);            
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            // Compute the height required to render the view
            // Assume Width will always be MATCH_PARENT.
            int width = MeasureSpec.getSize(widthMeasureSpec);
            int height = 3000 + 50; // Since 3000 is bottom of last Rect to be drawn added and 50 for padding.
            setMeasuredDimension(width, height);
        }

        @Override
        public void onDraw(Canvas canvas) {

            paint.setColor(Color.GREEN);
            canvas.drawRect(30, 30, 90, 200, paint);
            paint.setColor(Color.BLUE);

            canvas.drawLine(100, 20, 100, 1900, paint);

            paint.setColor(Color.GREEN);
            canvas.drawRect(200, 2000, 400, 3000, paint);
            }
    }
于 2013-04-12T06:05:50.823 に答える