1

私はドローボードアプリに取り組んでいます。次のようなカスタム ビューで描画機能を完成させました。

public class DrawView extends View implements OnTouchListener {

    private Paint bmPaint = new Paint();
    private Paint drawPaint = new Paint();
    private Path path = new Path();
    private Canvas cv = null;
    private Bitmap bm = null;
    private Drawable d;
    private boolean firstTimeThru = true;

    public DrawView(Context context) {
        super(context);
        init(context);
    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public void init(Context ctx) {
        setFocusable(true);
        setFocusableInTouchMode(true);
        this.setOnTouchListener(this);
    }

    @Override
    public void onDraw(Canvas canvas) {
        // Set everything up the first time anything gets drawn:
        if (firstTimeThru) {
            firstTimeThru = false;
            //d = getResources().getDrawable(R.drawable.zone0_over);
            d = new ColorDrawable(Color.TRANSPARENT);

            // Just quickly fill the view with a red mask:          
            canvas.drawColor(Color.TRANSPARENT);

            // Create a new bitmap and canvas and fill it with a red mask:
            bm = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),Config.ARGB_8888);           
            cv = new Canvas();
            cv.setBitmap(bm);
            d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            d.draw(cv);

            // Specify that painting will be with fat strokes:
            drawPaint.setStyle(Paint.Style.STROKE);
            drawPaint.setColor(Color.RED);
            drawPaint.setStrokeWidth(canvas.getWidth() / 200); // default 15

            // Specify that painting will clear the pixels instead of paining new ones:
            drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD));
        }

        cv.drawPath(path, drawPaint);
        canvas.drawBitmap(bm, 0, 0, bmPaint);

        super.onDraw(canvas);
    }

    public boolean onTouch(View view, MotionEvent event) {
        float xPos = event.getX();
        float yPos = event.getY();

        switch (event.getAction()) {
            // Set the starting position of a new line:
            case MotionEvent.ACTION_DOWN:
                path.moveTo(xPos, yPos);
                invalidate();
            return true;

            // Draw a line to the ending position:
            case MotionEvent.ACTION_MOVE:
                path.lineTo(xPos, yPos);
                invalidate();
            break;

            case MotionEvent.ACTION_UP:
            break;

            default:
            return false;
        }

        return true;
    }   

}

そして、このようなxml:

<ImageView
    android:id="@+id/change_color_btn"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<com.myapp.tool.DrawView
    android:id="@+id/draw"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

onDraw 関数内で線のサイズと線の色を設定したことに注意してください。現在は赤色ですが、ボタンを押して色を黄色に変更したいのですが、実行時にパラメータを設定するにはどうすればよいですか?

ありがとう

4

3 に答える 3

2

メンバー変数とセッター関数を DrawView クラスに追加します。

private int mLineColor = Color.RED;
public void setLineColor(int color)
{
    mLineColor = color;
    drawPaint.setColor(mLineColor);
}

onDraw を使用するように変更します。

drawPaint.setColor(mLineColor);

次に、Button onClick() ハンドラー内で、カスタム クラスを使用するアクティビティから設定できます。

DrawView drawview = (DrawView)findViewById(R.id.draw);
drawView.setLineColor(Color.YELLOW);
drawView.invalidate(); // trigger a redraw

ストローク幅についても同様に行います。

于 2015-01-16T09:08:55.620 に答える
1

色を切り替えるボタンをレイアウトに追加し、クリックリスナーを追加します。次に、パスの色を変更できます。現在のパスの色を切り替えますか、それとも新しいパスのみを切り替えますか?

于 2015-01-16T09:08:37.833 に答える
0

のようfieldなカスタム ビューで値を取得し、フィールド値を作成し、カスタム ビューを作成した後に色を次のように設定しますmColorsetter and getter

private int mColor;

public int getmColor() {
    return mColor;
}

public void setmColor(int mColor) {
    this.mColor = mColor;
    this.invalidate();
}
于 2015-01-16T09:19:27.437 に答える