Ссылка на нарисованный текст с помощью drawText () на холсте - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть холст, на котором я нарисовал некоторый текст, используя drawText () , возможно ли получить ссылку на этот текст? Я хочу выделить этот текст с помощью жеста onLongPress () и думаю, что для этого мне нужна ссылка на этот текст.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Это базовый c код для перемещения TextView поверх Canvas , надеюсь, это поможет:

public class SimpleDrawingView extends View {
    float fX = 0;
    float fY = 0;
    private LinearLayout layout;
    boolean shouldMoveTextView = false;
    private TextPaint textPaint;
    private TextView textView;

    public SimpleDrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFocusable(true);
        setFocusableInTouchMode(true);
        setupPaint();
        addTextView();
    }

    private void setupPaint() {


        textPaint = new TextPaint();
        textPaint.setAntiAlias(true);
        textPaint.setTextSize(26 * getResources().getDisplayMetrics().density);
        textPaint.setColor(0xFF000000);

    }

    private void addTextView() {

        layout = new LinearLayout(getContext());

        textView = new TextView(getContext());
        textView.setVisibility(View.VISIBLE);
        textView.setText("Movable_after_longpress");
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
        shouldMoveTextView = true;

        layout.addView(textView);

        ((LinearLayout.LayoutParams) (textView.getLayoutParams())).leftMargin = 50;
        ((LinearLayout.LayoutParams) (textView.getLayoutParams())).topMargin = 50;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawText("unmovable", 80, 200, textPaint);

        /** Draw layout on canvas**/
        layout.measure(canvas.getWidth(), canvas.getHeight());
        layout.layout(0, 0, canvas.getWidth(), canvas.getHeight());
        layout.draw(canvas);


    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {

        fX = event.getX();
        fY = event.getY();
        // Checks for the event that occurs
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:

                return true;
            case MotionEvent.ACTION_MOVE:

                LinearLayout.LayoutParams llp = ((LinearLayout.LayoutParams) (textView.getLayoutParams()));
                llp.leftMargin = (int) fX;
                llp.topMargin = (int) fY;
                textView.setLayoutParams(llp);
                break;
            default:
                return true;
        }
        // Force a view to draw again
        postInvalidate();
        return true;
    }
} 
0 голосов
/ 03 февраля 2020

У вас не будет привязки к тому, что вы нарисовали, используя drawText() на холсте. Чтобы реализовать выделенный текст, вы должны использовать Paint.measureText(), чтобы получить высоту и ширину текста, а затем нарисовать фон, чтобы создать собственный эффект. выделения текста (обрабатывайте длительное нажатие, используя onTouch()).

При рисовании текста на холсте вы должны обрабатывать все варианты представления текста как свои собственные.

Альтернативным способом является создание a TextView и добавьте его в любой макет, а затем используйте следующий код для рисования макета в canvas

//measure the width and height of the layout(covers entire canvas)
vLayout.measure(canvas.getWidth(), canvas.getHeight());
//set the bounds of the layout.
vLayout.layout(0, 0, canvas.getWidth(), canvas.getHeight());
vLayout.draw(canvas);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...