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>

 
 
 
 원본 은 첨부 파일 참조.

좋은 웹페이지 즐겨찾기