2016-12-05 4 views
0

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

+0

Ответ на этот вопрос да. – GurV

+0

Как насчет ответа на титульный вопрос? – DiTi

+0

Вы сказали: «Я пробовал». Покажи нам это. – GurV

ответ

0

взяты из этого поз: How to programmatically enable "show touches" option in Android?

• позволяют показать штрихи:

Settings.System.putInt(context.getContentResolver(), 
      "show_touches", 1); 

• Чтобы отключить показать штрихи:

Settings.System.putInt(context.getContentResolver(), 
      "show_touches", 0); 

Не забудьте добавить в свой android.permission.WRITE_SETTINGS Manifest.

EDIT:

вот DrawView.java, который реализует View.OnTouchListener и определяет несколько режимов отрисовки. однако в нем отсутствуют индикаторы.

в основной деятельности внутри setListener для DrawView вы переопределяете метод onStartDrawing: здесь вы можете решить, показывать или не показывать индикатор и как его стилизовать в зависимости от текущего режима DrawView (ручка, ластик и т. Д.) И других методов интерфейса переместите индикатор, если он будет видимым, и спрячьте его при завершении рисования. проверить код:

  mDrawView.setOnDrawViewListener(new DrawView.OnDrawViewListener() { 
       @Override public void onStartDrawing() { 
        canUndoRedo(); 
        // decide whether or not to show an 
        // indicator and style it depending on 
        // mDrawView's attributes and current drawing mode 

        setIndicator(mDrawView.getDrawingMode(),mDrawView.getDrawWidth()); 
       } 

       @Override 
       public void onMove(MotionEvent motionEvent) { 
        if(isIndicatorVisible){ 
         indicatorView.animate() 
           .x(motionEvent.getX()) 
           .y(motionEvent.getY()) 
           .setDuration(0) 
           .start(); 
        } 

       } 

       @Override public void onEndDrawing() { 
        canUndoRedo(); 
        //hide indicator here 
        if (isIndicatorVisible){ 
         indicatorView.setVisibility(View.GONE); 
         isIndicatorVisible = false; 

        } 

       } 

вот те изменения, которые я добавить в DrawView.java:

определен метод новый интерфейс недействительным OnMove (MotionEvent motionEvent)

public interface OnDrawViewListener { 
     void onStartDrawing(); 

     void onEndDrawing(); 

     void onClearDrawing(); 

     void onRequestText(); 

     void onMove(MotionEvent motionEvent); // added this method 
    } 

называется новый метод внутри onToch :

case MotionEvent.ACTION_MOVE: 
       onDrawViewListener.onMove(motionEvent); // added this line 
       mDrawMoveHistory.get(mDrawMoveHistory.size() - 1).setEndX(motionEvent.getX()).setEndY(motionEvent.getY()); 

       if (mDrawingTool == DrawingTool.PEN || mDrawingMode == DrawingMode.ERASER) { 
        mDrawMoveHistory.get(mDrawMoveHistory.size() - 1).getDrawingPathList() 
          .get(mDrawMoveHistory.get(mDrawMoveHistory.size() - 1).getDrawingPathList().size() - 1) 
          .lineTo(motionEvent.getX(), motionEvent.getY()); 
       } 
       invalidate(); 
       break; 

здесь метод setIndicator:

private void setIndicator(DrawingMode drawingMode, int drawWidth) { 
     if (drawingMode == DrawingMode.ERASER){ 
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(drawWidth, drawWidth); 
      indicatorView.setLayoutParams(params); 
      GradientDrawable border = new GradientDrawable(); 
      border.setStroke(1, 0xFF000000); //black border with full opacity 
      if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
       indicatorView.setBackgroundDrawable(border); 
      } else { 
       indicatorView.setBackground(border); 
      } 
      indicatorView.setVisibility(View.VISIBLE); 
      isIndicatorVisible = true; 
     } 
    } 
+0

Я видел это сообщение раньше, и это не совсем то, что мне нужно, но, чтобы быть уверенным, что я пробовал его с моим кодом. Он работает только как обходной путь, потому что я получаю очертание места, которое я касаюсь. То, что я попросил, - это указатель, который будет рисовать/стирать точно столько же, сколько размер (рисование/стирание уже покрыто). И я хочу это только на холсте, потому что на панели инструментов или где-нибудь еще бесполезно. – DiTi

+0

Другая проблема заключается в том, что это работает только для API <23. Более поздние версии не позволят изменять частные настройки, поэтому вопрос остается открытым. – DiTi

+0

Я отредактировал ответ .. код основан на этом проекте github: https://github.com/ByoxCode/DrawView .. Я пробовал изменения, которые я сделал, и он отлично работает. Удачи – msdev16

Смежные вопросы