Android: Как динамически сделать холст только на части экрана? - PullRequest
0 голосов
/ 28 апреля 2018

В Android, как сделать так, чтобы рисованный холст появлялся только на части экрана, когда пользователь выполняет действие?

Моя конечная цель состоит в том, чтобы динамически вставить в макет панель, которая, когда пользователь касается ее, на панели будет отображаться определенный текст.

Я искал и видел только способы, где холст обрабатывается как сам макет; не как представление, которое можно добавить в действие. И я понимаю, что для того, чтобы сделать его только частью экрана, мне нужно как-то обрабатывать его как представление, которое можно добавить в макет. Как мне это сделать?

1 Ответ

0 голосов
/ 28 апреля 2018

Для создания холста создайте пользовательский вид, как показано ниже:

public class CanvasView extends View {

public int width;
public int height;
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
Context context;
private Paint mPaint;
private float mX, mY;
private static final float TOLERANCE = 5;

public CanvasView(Context c, AttributeSet attrs) {
    super(c, attrs);
    context = c;

    // we set a new Path
    mPath = new Path();

    // and we set a new Paint with the desired attributes
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setColor(Color.BLACK);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeWidth(4f);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    // your Canvas will draw onto the defined Bitmap
    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
}

// override onDraw
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // draw the mPath with the mPaint on the canvas when onDraw
    canvas.drawPath(mPath, mPaint);
}

// when ACTION_DOWN start touch according to the x,y values
private void startTouch(float x, float y) {
    mPath.moveTo(x, y);
    mX = x;
    mY = y;
}

// when ACTION_MOVE move touch according to the x,y values
private void moveTouch(float x, float y) {
    float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
    if (dx >= TOLERANCE || dy >= TOLERANCE) {
        mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
        mX = x;
        mY = y;
    }
}

public void clearCanvas() {
    mPath.reset();
    invalidate();
}

// when ACTION_UP stop touch
private void upTouch() {
    mPath.lineTo(mX, mY);
}

//override the onTouchEvent
@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            startTouch(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            moveTouch(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            upTouch();
            invalidate();
            break;
    }
    return true;
}
}

После этого используйте этот canvasView в xml-файл:

<com.example.canvasdemo.CanvasView
    android:id="@+id/signature_canvas"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textColor="@color/colorWhite" />

И последнее в вашей основной деятельности:

public class MainActivity extends AppCompatActivity {

Button btnClear;
private CanvasView customCanvas;

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

    customCanvas = (CanvasView) findViewById(R.id.signature_canvas);
    btnClear = (Button) findViewById(R.id.button1);


    btnClear.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            customCanvas.clearCanvas(); // to clear canvas
        }
    });


}

example picture

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...