7

Mam sytuację, której nie jestem w stanie naprawić, mam nadzieję, że otrzymam od Ciebie kilka rad.Jak sprawić, aby tekst był przeciągany w LinearLayout gładko, w systemie Android?

Sytuacja jest prosta: mam LinearLayout, w którym mam TextView z wieloma liniami tekstu. Użytkownik może przeciągać widok TextView, dopóki nie znajdzie pozycji, którą lubi. Co jest naprawdę ważne, to że TextView może być częściowo poza LinearLayout (pojawi się przycięty).

Oto niektóre przykłady kodu:

<LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="top|center_horizontal" 
     android:clipChildren="false" 
     android:gravity="center_horizontal|center_vertical" 
     android:orientation="vertical" > 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:textColor="@color/text_color" 
      android:textSize="16sp" /> 
    </LinearLayout> 

Jak widać LinearLayout ma clipChildren = false aby umożliwić odcięcie tekstu. Dla TextView ustawić dotykowy słuchacza

txt.setOnTouchListener(new View.OnTouchListener() { 
      int initialX = 0; 
      int initialY = 0; 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getActionMasked()) { 
       case MotionEvent.ACTION_DOWN: 
        initialX = (int) event.getX(); 
        initialY = (int) event.getY(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
          int currentX = (int) event.getX(); 
          int currentY = (int) event.getY(); 
          LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) txt.getLayoutParams(); 

          int left = lp.leftMargin + (currentX - initialX); 
          int top = lp.topMargin + (currentY - initialY); 
          int right = lp.rightMargin - (currentX - initialX); 
          int bottom = lp.bottomMargin - (currentY - initialY); 

          lp.rightMargin = right; 
          lp.leftMargin = left; 
          lp.bottomMargin = bottom; 
          lp.topMargin = top; 

          txt.setLayoutParams(lp); 
        break; 
       default: 
        break; 
       } 
       return true; 
      } 
     }); 

I tu jest mój problem: Jak widać mam ustawić wszystkie parametry układu (prawo, lewo, dół, góra marginesy). Dlaczego ?

1) Jeśli używam tylko lewego/górnego, przeciągnięcie jest płynne, ale tekst zostaje zawinięty na prawym obramowaniu zamiast przycinania. Prawdopodobnie z powodu wartości prawego marginesu 0.

2) Jeśli użyję wszystkich marginesów, tekst zostanie przycięty, jak chcę, ale ruch nie jest płynny, po prostu przeskakuje o kilka pikseli.

Jak mogę to naprawić?

Odpowiedz

2

Dobrze. to jest dziwne. Wstawiając TextView wewnątrz innego LinearLayout o tym samym rozmiarze co pierwszy, sprawia, że ​​wszystko jest gładkie. Nie mam pojęcia dlaczego.

Powiązane problemy