如何在android中使LinearLayout中的TextView拖动平滑?

Posted

技术标签:

【中文标题】如何在android中使LinearLayout中的TextView拖动平滑?【英文标题】:How to make the TextView drag in LinearLayout smooth, in android? 【发布时间】:2013-01-18 23:44:10 【问题描述】:

我有一个无法解决的情况,希望我能得到你的一些建议。

情况很简单:我有一个 LinearLayout,其中有一个 TextView,其中包含多行文本。用户可以拖动 TextView 直到找到他喜欢的位置。真正重要的是TextView可以部分脱离LinearLayout(会显得剪掉了)。

以下是一些代码示例:

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

        <TextView
            android:layout_
            android:layout_
            android:gravity="center"
            android:textColor="@color/text_color"
            android:textSize="16sp" />
    </LinearLayout>

如您所见,LinearLayout 具有 clipChildren = false 以允许截断文本。 对于 textview 我设置了一个触摸监听器

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;
            
        );

这是我的问题:如您所见,我已经设置了所有布局参数(右、左、下、上边距)。这是为什么呢?

1) 如果我只使用左/上拖动,则足够平滑,但文本会被包裹在右边框而不是被剪切。可能是因为右边的 0 边距值。

2) 如果我使用所有边距,文本会按照我的意愿被剪切,但移动并不顺畅,它只是跳跃了几个像素。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

嗯。这很奇怪。通过将 TextView 插入另一个与初始大小相同的 LinearLayout 中,可以使一切顺利。我不知道为什么。

【讨论】:

以上是关于如何在android中使LinearLayout中的TextView拖动平滑?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android Studio中使图像中的特定颜色透明?

Android:如何将 LinearLayout 的内容垂直包装在 TableRow 中?

如何在android的linearlayout中删除阴影?

Android:- 如何在整个应用程序中使动态 HashMap 可访问? [复制]

如何在Android的文本视图中使电话号码可点击

如何在运行时在android中使部分文本加粗?