TextView에 선택 윤곽 효과를 사용하고 싶지만 TextView에 포커스가있을 때만 텍스트가 스크롤됩니다. 그것은 문제입니다. 제 경우에는 할 수 없기 때문입니다.
나는 사용하고있다 :
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
TextView가 항상 텍스트를 스크롤하도록하는 방법이 있습니까? 이 작업이 Android Market 앱에서 수행되는 것을 보았습니다. 여기서 앱 이름이 포커스를받지 않더라도 제목 표시 줄에서 스크롤되지만 API 문서에서 언급되지 않았습니다.
답변
나는 문제에 직면했고 내가 생각 해낸 가장 짧은 해결책은 TextView에서 파생 된 새 클래스를 만드는 것입니다. 클래스는 세 가지 메서드 onFocusChanged , onWindowFocusChanged 및 isFocused 를 재정 의하여 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;
}
답변
나는 오늘 마침내이 문제에 대해 생각해 냈고 hierarchyviewer
Android Market 응용 프로그램에 불을 붙 였습니다.
앱의 세부 정보 화면에서 제목을 보면 평범한 오래된 TextView
. 그 속성을 조사한 결과 초점이 맞지 않았고, 초점을 맞출 수 없었 으며 일반적으로 매우 평범한 것으로 나타났습니다. 단, 선택된 것으로 표시되었다는 사실을 제외하고는 말입니다 .
나중에 한 줄의 코드가 작동했습니다. 🙂
textView.setSelected(true);
이것은 Javadoc이 말하는 것을 감안할 때 의미 가 있습니다 .
보기를 선택하거나 선택하지 않을 수 있습니다. 선택은 초점과 동일하지 않습니다. 보기는 일반적으로 ListView 또는 GridView와 같은 AdapterView의 컨텍스트에서 선택됩니다.
즉, 마켓 앱에서와 같이 목록보기에서 항목을 스크롤 할 때만 지금 선택한 텍스트가 스크롤을 시작합니다. 그리고이 특정 항목 TextView
은 포커스를 받거나 클릭 할 수 없기 때문에 선택 상태를 잃지 않습니다.
불행히도 내가 아는 한 레이아웃 XML에서 선택한 상태를 미리 설정할 수있는 방법이 없습니다.
그러나 위의 한 줄짜리가 잘 작동합니다.
답변
이 매개 변수를 TextView에 넣으십시오. 효과가있다 🙂
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit ="marquee_forever"
android:scrollHorizontally="true"
android:focusable="true"
android:focusableInTouchMode="true"
답변
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 인 텍스트가있는 TextView가 있고 문구의 끝을 볼 수 있도록 텍스트를 “당기는”애니메이션을 만들고 싶습니다.
(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 값을 계산해야합니다. 원하는 효과를 얻으려면 텍스트가 화면 밖으로 확장되는 것과 똑같은 픽셀을 “당겨”야합니다. (구성표에서 <<<< 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;
}
이 작업을 수행하는 더 쉬운 방법이있을 수 있지만 이것은 생각할 수있는 모든보기에서 작동하며 재사용 할 수 있습니다. textView의 활성화 / onFocus 기능을 중단하지 않고 ListView에서 TextView에 애니메이션을 적용하려는 경우 특히 유용합니다. 또한 뷰에 초점이 맞춰져 있지 않아도 계속 스크롤됩니다.
답변
여전히 답이 필요한지 모르겠지만 쉽게 할 수있는 방법을 찾았습니다.
다음과 같이 애니메이션을 설정하십시오.
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_X
, END_POS_X
, START_POS_Y
하고 END_POS_Y
있는 float
반면, 값 TICKER_DURATION
입니다 int
내 다른 상수를 선언했다.
그런 다음 이제이 애니메이션을 TextView에 적용 할 수 있습니다.
TextView tickerText = (TextView) findViewById(R.id.ticker);
tickerText.setAnimation(mAnimation);
그리고 그게 다야. 🙂
내 애니메이션은 오른쪽 화면 (300f)에서 시작하여 왼쪽 화면 (-300f)에서 15 초 (15000)의 지속 시간으로 끝납니다.
답변
선택 윤곽 텍스트 항목이있는 ListView에 대해 다음 코드를 작성했습니다. 위에서 설명한 setSelected 솔루션을 기반으로합니다. 기본적으로 ArrayAdapter 클래스를 확장하고 getView 메서드를 재정 의하여 TextView를 반환하기 전에 선택합니다.
// 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;
}
}
답변
이것은 내 Google 검색 상단에 나타나는 답변이므로 꽤 자주 기억하는 데 어려움을 겪고 있기 때문에 여기에 유용한 답변을 게시 할 수 있다고 생각했습니다. 어쨌든 이것은 나를 위해 작동하며 XML 속성과 A 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);
}
}
});