有没有办法让椭圆大小=“选框”总是滚动?

我想在TextView上使用选取框效果,但TextView获取焦点时只能滚动文本。 这是一个问题,因为在我的情况下,它不能。

我在用:

android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" 

有没有办法让TextView总是滚动它的文本? 我已经在Android Market应用程序中看到了这一点,即使它没有获得焦点,应用程序名称也会在标题栏中滚动,但是我无法在API文档中find它。

我一直在面对这个问题,我想出了最短的解决scheme是创build一个从TextView派生的新类。 该类应该重写三个方法onFocusChangedonWindowFocusChangedisFocused使TextView全部聚焦。

 @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public void onWindowFocusChanged(boolean focused) { if(focused) super.onWindowFocusChanged(focused); } @Override public boolean isFocused() { return true; } 

我终于在今天遇到了这个问题,于是在Android Market应用程序中启动了hierarchyviewer

在应用程序的详细信息屏幕上查看标题,他们使用普通的旧的TextView 。 检查其属性表明,它没有集中, 不能集中,通常是非常普通的 – 除了它被标记为选定的事实。

一行代码后,我有它的工作:)

 textView.setSelected(true); 

这是有道理的,鉴于什么Javadoc说 :

视图可以被select或不被select。 请注意,select与焦点不同。 视图通常在AdapterView(如ListView或GridView)的上下文中select。

即当你滚动列表视图中的一个项目(如在市场应用程序),只有那么现在select的文本开始滚动。 而且由于这个特定的TextView不可聚焦或可点击,所以它永远不会失去它的select状态。

不幸的是,据我所知,没有办法从布局XML中预先设置选定的状态。
但是上面的一行代码对我来说工作得很好。

只要把这些参数在你的TextView中。 有用 :)

  android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit ="marquee_forever" android:scrollHorizontally="true" android:focusable="true" android:focusableInTouchMode="true" 

我不知道你是否仍然需要这个答案,但我find了一个简单的方法来做到这一点。

设置你的animation像这样:

 Animation mAnimation = new TranslateAnimation(START_POS_X, END_POS_X, START_POS_Y, END_POS_Y); mAnimation.setDuration(TICKER_DURATION); mAnimation.setRepeatMode(Animation.RESTART); mAnimation.setRepeatCount(Animation.INFINITE); 

START_POS_XEND_POS_XSTART_POS_YEND_POS_Yfloat值,而TICKER_DURATION是我用其他常量声明的int

然后,您现在可以将此animation应用于您的TextView:

 TextView tickerText = (TextView) findViewById(R.id.ticker); tickerText.setAnimation(mAnimation); 

就是这样。 🙂

我的animation在屏幕右侧(300f)开始,在屏幕左侧(-300f)结束,持续时间为15秒(15000)。

TranslateAnimation通过将“视图”以一定的方向“拉”到一个方向来工作。 你可以设置从哪里开始这个“拉”,并在哪里结束。

 TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta); 

fromXDelta设置运动的起始位置在X轴上的偏移量。

 fromXDelta = 0 //no offset. fromXDelta = 300 //the movement starts at 300px to the right. fromXDelta = -300 //the movement starts at 300px to the left 

toXDelta在X轴中定义运动的偏移结束位置。

 toXDelta = 0 //no offset. toXDelta = 300 //the movement ends at 300px to the right. toXDelta = -300 //the movement ends at 300px to the left. 

如果文本的宽度大于fromXDelta和toXDelta之间的差值,则文本将无法在屏幕内移动并强制移动。


假设我们的屏幕尺寸是320×240像素。 我们有一个文本宽度为700px的文本视图,我们希望创build一个“拉动”文本的animation,以便我们可以看到短语的结尾。

  (screen) +---------------------------+ |<----------320px---------->| | | |+---------------------------<<<< X px >>>> movement<-----|| some TextView with text that goes out... |+--------------------------- | unconstrained size 700px | | | | | +---------------------------+ +---------------------------+ | | | | <<<< X px >>>>---------------------------+| movement<----- some TextView with text that goes out... || ---------------------------+| | | | | | | +---------------------------+ 

首先我们从fromXDelta = 0设置,这样移动没有起始偏移量。 现在我们需要计算toXDelta值。 为了达到预期的效果,我们需要“拉”出与屏幕跨越的完全相同的文本。 (在scheme中用<<<< X px >>>>表示)由于我们的文本有700宽度,可见区域是320px(屏幕宽度),我们设置:

 tXDelta = 700 - 320 = 380 

我们如何计算屏幕宽度和文本宽度?


以Zarah Snippet为起点:

  /** * @param view The Textview or any other view we wish to apply the movement * @param margin A margin to take into the calculation (since the view * might have any siblings in the same "row") * **/ public static Animation scrollingText(View view, float margin){ Context context = view.getContext(); //gets the context of the view // measures the unconstrained size of the view // before it is drawn in the layout view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); // takes the unconstrained wisth of the view float width = view.getMeasuredWidth(); // gets the screen width float screenWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth(); // perfrms the calculation float toXDelta = width - (screenWidth - margin); // sets toXDelta to 0 if the text width is smaller that the screen size if (toXDelta < 0) {toXDelta = 0; } else { toXDelta = 0 - toXDelta;} // Animation parameters Animation mAnimation = new TranslateAnimation(0, toXDelta, 0, 0); mAnimation.setDuration(15000); mAnimation.setRepeatMode(Animation.RESTART); mAnimation.setRepeatCount(Animation.INFINITE); return mAnimation; } 

可能有更简单的方法来执行此操作,但是这适用于您可以想到且可重复使用的每个视图。 如果要在ListView中为TextView设置animation而不破坏textView的启用/ onFocusfunction,那么它是特别有用的。 即使视图不集中,它也会不断滚动。

我为带有选取框文本项目的ListView编写了以下代码。 它基于上面描述的setSelected解决scheme。 基本上,我扩展了ArrayAdapter类并重写getView方法来selectTextView,然后再返回它:

  // Create an ArrayAdapter which selects its TextViews before returning // them. This would enable marqueeing while still making the list item // clickable. class SelectingAdapter extends ArrayAdapter<LibraryItem> { public SelectingAdapter( Context context, int resource, int textViewResourceId, LibraryItem[] objects ) { super(context, resource, textViewResourceId, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textview = (TextView) view.findViewById( R.id.textview_playlist_item_title ); textview.setSelected(true); textview.setEnabled(true); textview.setFocusable(false); textview.setTextColor(0xffffffff); return view; } } 

这是在我的谷歌search的顶部popup的答案,所以我想我可以在这里发表一个有用的答案,因为我经常记住这一点挣扎。 无论如何,这适用于我,需要XML属性和一个onFocusChangeListener。

 //XML <TextView android:id="@+id/blank_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:layout_gravity="center_horizontal|center_vertical" android:background="#a4868585" android:textColor="#fff" android:textSize="15sp" android:singleLine="true" android:lines="1" android:ellipsize="marquee" android:marqueeRepeatLimit ="marquee_forever" android:scrollHorizontally="true" android:focusable="true" android:focusableInTouchMode="true" tools:ignore="Deprecated" /> //JAVA titleText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { titleText.setSelected(true); } } });