Android TextView 클릭 으로 애니메이션 효과 펼 치기
5799 단어 textview
오늘 면접 에서 만난 문제 중 하 나 는 Android TextView 를 누 르 면 애니메이션 효과 (즉, 문자 한 줄 한 줄 아래로 펼 쳐 짐) 를 실현 합 니 다. 그러나 이것 은 Animation 이 없 는 것 입 니 다. 저녁 에 집에 돌아 갈 일이 없 으 면 이 루어 집 니 다.
다음은 아 이 디 어 를 말씀 드 리 겠 습 니 다. 먼저 TextView 가 완전히 펼 쳐 졌 을 때의 최대 max Lines 기록 을 가 져 온 다음 에 TextView 의 max Line 을 지정 하고 자 하 는 모든 값 으로 설정 하 는 것 입 니 다. 제 가 지정 한 것 은 1 입 니 다. 이렇게 하면 VIEW 를 완성 한 후에 우리 가 본 TextView 는 완전히 펼 쳐 진 것 이 아 닙 니 다. 이렇게 하 는 주요 목적 은 완전히 펼 쳐 진 max Lines 를 가 져 오 는 것 입 니 다.후 사용자 가 클릭 할 때 max Line 크기 를 계속 업데이트 하면 됩 니 다.
onCreate 에서 가장 큰 max Lines 를 어떻게 캡 처 하 는 지 에 대해 서 는 이렇게 할 수 있 습 니 다. View 류 의 getView TreeObserver 방법 으로 지정 한 View 의 관찰 자 를 얻 을 수 있 습 니 다. 컨트롤 을 그리 기 전 순간 에 리 셋 을 할 수 있 습 니 다. 그러면 속도 가 지연 되 지 않 고 얻 은 수 거 는 정확 합 니 다. 그러나 이 방법 은 나중에 반복 적 으로 호출 될 수 있 기 때문에 제한 을 넣 어야 합 니 다.일반적인 수요 에서 View 류 의 getView TreeObserver 방법 만 사용 하면 지정 한 View 의 관찰 자 를 얻 을 수 있 습 니 다. 컨트롤 을 그리 기 전 순간 에 리 셋 을 하면 속도 가 지연 되 지 않 고 얻 은 데 이 터 는 정확 합 니 다. 그러나 이 방법 은 나중에 반복 적 으로 사 용 될 수 있 기 때문에 제한 이 필요 합 니 다. 일반적인 수요 에서...한 번 만 계산 하면 돼. 한 번 만 계산 하면 돼.
구체 적 인 실현 은 코드 를 보 세 요. 코드 에 주석 이 있 으 니 일일이 설명 하지 않 겠 습 니 다.
메 인 인터페이스 MainActivity. java:
package cn.mytest.expandtextview;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
private static final int MAX = 1;// maxLine
private static final int TIME = 20;//
private int maxLines;
private TextView textView;
private boolean hasMesure = false;
private Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
// ViewTreeObserver View , , View , onDraw
//textView maxLine , maxLine
textView = (TextView) findViewById(R.id.textView);
ViewTreeObserver viewTreeObserver = textView.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
//
if(!hasMesure){
// maxLine
maxLines = textView.getLineCount();
// maxLine , View maxLine TextView
textView.setMaxLines(MAX);
hasMesure = true;
}
return true;
}
});
textView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
toggle();
}
/**
* TextView
*/
@SuppressLint("HandlerLeak")
private void toggle(){
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int lines = msg.what;
// , TextView maxLine
textView.setMaxLines(lines);
textView.postInvalidate();
}
};
if(thread != null)
handler.removeCallbacks(thread);
thread = new Thread(){
@Override
public void run() {
int count = MAX;
while(count++ <= maxLines){
// 20mms
Message message = new Message();
message.what = count;
handler.sendMessage(message);
try {
Thread.sleep(TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
super.run();
}
};
thread.start();
}
}
단순 레이아웃 파일:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:text="@string/test"
android:textSize="18sp" />
</RelativeLayout>
string. xml 텍스트:
<string name="test">1996 1 , · · 。[26] , 。[27] PageRank , 。[28][29] , ‘BackRub’, ‘Google’。[30][31][32] googol( 1 100 0, 10100) ,[33][34] 。[35] Google , google.stanford.edu。[36]</string>
원본 은 첨부 파일 참조.