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ć?