Android UI 는 여러 줄 텍스트 접 기 전개 효 과 를 구현 합 니 다.

이 글 은단일 텍스트 수평 터치 슬라이딩 효과EditText 를 통 해 TextView 단일 줄 의 텍스트 수평 미끄럼 효 과 를 실현 하 는 것 을 소개 했다.
본 고 는 여러 줄 의 텍스트 접 기 전 개 를 계속 소개 하고 사용자 정의 레이아웃 View 는 여러 줄 의 텍스트 접 기와 전 개 를 실현 합 니 다.
1.개술
자주 앱 에서 인용 글 이나 큰 단락 의 박문 이 있 는 내용 을 볼 수 있 고 그들의 전시 스타일 도 약간 재 미 있 습 니 다.기본 값 은 접 힌 것 입 니 다.글 을 클릭 하면 자동 으로 펼 쳐 집 니 다.다시 클릭 하면 그 는 다시 움 츠 러 들 것 이다.
인터넷 에서 일부 효 과 를 찾 아 만 족 스 럽 지 못 하 다.마지막 으로 사용자 정의 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃 레이아웃비교적 누추 하지만 쓸 수 있다.이 방면 에 필요 한 친 구 는 약간 개조 할 수 있다.더 좋 은 아이디어 가 있다 면 나 눠 보 세 요.
효과 그림:

2.구체 적 실현
그러나 실현 효 과 를 보면 필요 한 view 만 간단하게 정의 하면 되 고 나중에 확장 사용 과 유용 을 편리 하 게 하기 위해 전체 구 조 를 포장 하여 직접 사용 하기에 편리 하 다.
2.1 여러 개의 레이아웃 조합 을 통 해 실현
첫 번 째 아 이 디 어 는 당연히 여러 뷰 그룹 으로 이 루어 진다.그 동안 LinearLayout 레이아웃 을 각각 TextView 와 ImageView 로 정의 합 니 다.
대략적인 절차:
-레이아웃,수직 선형 LinearLayout 레이아웃,TextView 와 ImageView 를 정의 합 니 다.layot 에서 기본 구성 요 소 를 정의 합 니 다.
-TextView 의 높이 를 지정 한 줄 수*줄 높이 로 설정 합 니 다.max Line 을 사용 하지 않 는 이 유 는 max Line 이 텍스트 를 표시 하 는 줄 수 를 제어 하기 때문에 뒤에서 애니메이션 으로 모든 내용 을 펼 치 는 것 이 불편 합 니 다.그래서 여기 TextView 의 높이 도 wrapcontent。
-전체 레이아웃 에 클릭 이벤트,바 인 딩 애니메이션 을 추가 합 니 다.클릭 시 TextView 가 펼 쳐 지지 않 으 면 실제 높이 로 펼 쳐 지고 imageView 가 회전 합 니 다.그렇지 않 으 면 지정 한 줄 수*줄 높이 로 줄 이 고 imageView 회전 으로 줄 입 니 다.
코드 작성 시작:
1.xml 에서 레이아웃 정의:

 <LinearLayout
 android:id="@+id/description_layout"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical"
 android:paddingLeft="12dip"
 android:paddingRight="12dip"
 android:paddingTop="5dip" >

 <TextView
 android:id="@+id/description_view"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:textColor="@android:color/black"
 android:textSize="18dip" >
 </TextView>

 <ImageView
 android:id="@+id/expand_view"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="right"
 android:paddingBottom="5dip"
 android:paddingLeft="5dip"
 android:paddingRight="5dip"
 android:paddingTop="5dip"
 android:src="@drawable/text_ic_expand"
 android:visibility="gone" />
 </LinearLayout>

2.우선 activity 에서 이 view 를 정의 하고 초기 화 합 니 다.

public class MainActivity extends Activity {
 TextView descriptionView;
 View layoutView ,expandView; //LinearLayout   ImageView
 int maxDescripLine = 3; //TextView        

 // OnCreate    
 {
 layoutView = findViewById(R.id.description_layout);
 descriptionView = (TextView)findViewById(R.id.description_view);
 expandView = findViewById(R.id.expand_view);
 }
}
3.그 다음 에 textview 디 스 플레이 텍스트 를 설정 하고 기본 디 스 플레이 줄 수 에 따라 높이 를 설정 하 며 완전히 표시 되 었 는 지 여부(현재 디 스 플레이 줄 수가 실제 줄 수 보다 큰 지)에 따라 더 많은 단 추 를 누 를 필요 가 있 는 지 판단 합 니 다.

 //    
 descriptionView.setText(getText(R.string.content));

 //descriptionView        
 descriptionView.setHeight(descriptionView.getLineHeight() * maxDescripLine);
 //                
 descriptionView.post(new Runnable() {

 @Override
 public void run() {
 expandView.setVisibility(descriptionView.getLineCount() > maxDescripLine ? View.VISIBLE : View.GONE);
 }
 }); 
textView 는 wrap 을 설정 하기 때 문 입 니 다.content,그래서 실제 높이 와 줄 수 를 표시 합 니 다.여 기 는 max DescriptLine 에 따라 높이 를 설정 합 니 다.
마지막 줄 코드 를 봤 는데 누가 물 어 볼 까요?ImageView(클릭 하여 더 많이 펼 치기)표시 해 야 할 판단 논 리 를 왜 post 방법 에 넣 어야 합 니까?이 는 OnCreate 방법 에서 정 의 된 textView 가 바로 렌 더 링 되 고 표시 되 지 않 기 때문에 textview 의 getLineCount()에서 얻 은 값 은 보통 0 이 므 로 post 를 사용 하여 그림 을 완성 한 후에 ImageView 를 표시 제어 합 니 다.
ps:제 가 설명 할 수 없 을 것 같은 친 구 는 stackoverflow 의 설명 how to use getlinecount()in textview android 를 볼 수 있 습 니 다.
4.layoutView 에 클릭 이 벤트 를 설정 합 니 다.
ImageView 에 RotateAnimation 의 회전 애니메이션 을 정의 하고 회전 과정 에서 회전 백분율 진도 에 따라 textView 높이 를 제어 하여 우리 가 원 하 는 효 과 를 얻 을 수 있 습 니 다.

 layoutView.setOnClickListener(new View.OnClickListener() {
 boolean isExpand;//        

 @Override
 public void onClick(View v) {
 isExpand = !isExpand;
 descriptionView.clearAnimation();//      
 final int deltaValue;//    ,    maxLine     
 final int startValue = descriptionView.getHeight();//    
 int durationMillis = 350;//      
 if (isExpand) {
 /**
 *     
 *            
 */
 deltaValue = descriptionView.getLineHeight() * descriptionView.getLineCount() - startValue;
 RotateAnimation animation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 animation.setDuration(durationMillis);
 animation.setFillAfter(true);
 expandView.startAnimation(animation);
 } else {
 /**
 *     
 *             
 */
 deltaValue = descriptionView.getLineHeight() * maxDescripLine - startValue;
 RotateAnimation animation = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 animation.setDuration(durationMillis);
 animation.setFillAfter(true);
 expandView.startAnimation(animation);
 }
 Animation animation = new Animation() {
 protected void applyTransformation(float interpolatedTime, Transformation t) { //  ImageView           textview  ,      
 descriptionView.setHeight((int) (startValue + deltaValue * interpolatedTime));
 }
 };
 animation.setDuration(durationMillis);
 descriptionView.startAnimation(animation);
 }
 });
이로써 레이아웃 을 통 해 우리 가 원 하 는 효 과 를 실현 했다.구체 적 인 코드 는 코드 예제 의 첫 번 째 부분 을 참조 합 니 다.
물론 우 리 는 이렇게 사용 할 수 있 지만,매번 이렇게 다시 쓰 는 것 은 좀 번 거 로 워 보인다.따라서 그 를 단독 컨트롤 러 로 써 앞으로 주머니 를 열 어 즉석 으로 먹 을 수 있 도록 할 필요 가 있다.잔말 말고 음식 나 와.
2.2 사용자 정의 View 조합 을 통 해 패키지
이 view 의 레이아웃 구 조 는 xml 를 사용 하여 layot 를 정의 하지 않 고 LinearLayout 를 계승 하 는 MoreTextView 류 를 직접 정의 합 니 다.이 클래스 에는 TextView 와 ImageView 가 추가 되 어 있 습 니 다.
1.stylable 사용자 정의 보기 속성 사용
뒤쪽 xml 레이아웃 에서 MoreTextView 라 는 사용자 정의 View 를 편리 하 게 사용 할 수 있 도록
android:text = “XXX”
android:textSize = “XXX”
이렇게 빠 른 바 인 딩 텍스트 내용 과 글꼴 크기 등 속성 을 설정 합 니 다.declare-styleable 을 통 해 values 파일 의 xml 에서 원 하 는 속성 을 정의 하고 View 에서 가 져 오고 사용 할 수 있 습 니 다.declare-styleable 을 자세히 사용 하 는 내용 은 뒤에서 보충 합 니 다.여기 서 간략하게 말씀 드 리 겠 습 니 다.
예 를 들 어 MoreTextView 에 있어 야 할 기본 속성 은 텍스트 글꼴 크기(textSize),색상(textColor)과 텍스트 내용(text),그리고 기본 디 스 플레이 줄 수(max Line)등 몇 가지 속성 이다.TextView 처럼 xml 에 바 인 딩 을 직접 설정 하려 면 이렇게 할 수 있 습 니 다.
우선 values 디 렉 터 리 에 attrs.xml(이름 마음대로)를 새로 만 들 고 MoreTextView 속성 을 정의 합 니 다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="MoreTextStyle">
 <attr name="textSize" format="dimension"/>
 <attr name="textColor" format="color"/>
 <attr name="maxLine" format="integer" />
 <attr name="text" format="string" />
 </declare-styleable>
</resources>
2.MoreTextView 를 사용자 정의 하고 이 속성의 값 가 져 오기
위 에서 이 속성 을 정의 하면 xml 에서 사용 할 수 있 습 니 다.
more:text = “XXX”
more:textSize = “XXX”
more : textColor = “XXX”
more : maxLine = “XXX”
(비고:more 라 는 키 워드 는 마음대로 사용 할 수 있 습 니 다)
이렇게 속성 값 을 직접 설정 합 니 다.그럼 구체 적 으로 어떻게 가 치 를 취 하 는 지 는 잠시 후에 말씀 드 리 겠 습 니 다.
(1)MoreTextView 의 속성 정의:

public class MoreTextView extends LinearLayout{
 protected TextView contentView; //    
 protected ImageView expandView; //    

 //  styleable    
 protected int textColor; 
 protected float textSize;
 protected int maxLine;
 protected String text;

 //     
 public int defaultTextColor = Color.BLACK;
 public int defaultTextSize = 12;
 public int defaultLine = 3;

 //....     
}

(2)MoreTextView 의 구조 방법:

 public MoreTextView(Context context, AttributeSet attrs) {
 super(context, attrs);
 initalize(); 
 initWithAttrs(context, attrs); 
 bindListener();
 }
이 세 가지 방법 은 간단하게 설명 한다.
initalize()를 초기 화하 고 View 를 추가 합 니 다.TextView 와 ImageView 를 초기 화하 고 MoretextView 에 추가 합 니 다.
initWithAtts(context,attrs)에서 값 을 추출 하고 설정 합 니 다.attrs 를 이용 하여 xml 레이아웃 에서 우리 가 설정 한 text/textSize/textColor/max Line 등 속성의 속성 값 을 가 져 와 View 에 설정 합 니 다.
bindListener()바 인 딩 클릭 이벤트 및 애니메이션 설정.현재 MoreTextView 에 클릭 이 벤트 를 설정 하여 접 고 펼 치 기 를 실현 합 니 다.
각 방법의 구체 적 인 실현:

//      View
protected void initalize() {
 setOrientation(VERTICAL); //      
 setGravity(Gravity.RIGHT); //   
 //   textView   
 contentView = new TextView(getContext());
 addView(contentView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
 //   ImageView   
 expandView = new ImageView(getContext());
 int padding = dip2px(getContext(), 5);
 expandView.setPadding(padding, padding, padding, padding);
 expandView.setImageResource(R.drawable.text_ic_expand);
 LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
 addView(expandView, llp);
값 을 추출 하고 이 부분 을 설정 할 필요 가 있 습 니 다.저 희 는 TypedArray 를 이용 하여 정 의 된 stylable 에서 속성 값 을 꺼 내 서 정 의 된 클래스 의 속성 변 수 를 부여 합 니 다.취 소 된 후에 recycle()를 호출 하여 회수 하여 방출 하 는 것 을 기억 하 세 요.

 protected void initWithAttrs(Context context, AttributeSet attrs) {
 TypedArray a = context.obtainStyledAttributes(attrs, 
 R.styleable.MoreTextStyle); 
 int textColor = a.getColor(R.styleable.MoreTextStyle_textColor, 
 defaultTextColor); //    ,  defaultTextColor
 textSize = a.getDimensionPixelSize(R.styleable.MoreTextStyle_textSize, defaultTextSize);//      ,  defaultTextSize
 maxLine = a.getInt(R.styleable.MoreTextStyle_maxLine, defaultLine);//      ,  defaultLine
 text = a.getString(R.styleable.MoreTextStyle_text);//     

 //   textView bindTextView(textColor,textSize,maxLine,text);

 a.recycle();//    
 }

 //   textView 
 protected void bindTextView(int color,float size,final int line,String text){
 contentView.setTextColor(color);
 contentView.setTextSize(TypedValue.COMPLEX_UNIT_PX,size);
 contentView.setText(text);
 contentView.setHeight(contentView.getLineHeight() * line);
 post(new Runnable() {//    ,    

 @Override
 public void run() {
 expandView.setVisibility(contentView.getLineCount() > line ? View.VISIBLE : View.GONE);

 }
 });
 }
마지막 으로 클릭 이벤트 설정.

 //       ,    
 protected void bindListener(){
 setOnClickListener(new View.OnClickListener() {
 boolean isExpand;

 @Override
 public void onClick(View v) {
 isExpand = !isExpand;
 contentView.clearAnimation();
 final int deltaValue;
 final int startValue = contentView.getHeight();
 int durationMillis = 350;
 if (isExpand) {
 deltaValue = contentView.getLineHeight() * contentView.getLineCount() - startValue;
 RotateAnimation animation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 animation.setDuration(durationMillis);
 animation.setFillAfter(true);
 expandView.startAnimation(animation);
 } else {
 deltaValue = contentView.getLineHeight() * maxLine - startValue;
 RotateAnimation animation = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 animation.setDuration(durationMillis);
 animation.setFillAfter(true);
 expandView.startAnimation(animation);
 }
 Animation animation = new Animation() {
 protected void applyTransformation(float interpolatedTime, Transformation t) {
 contentView.setHeight((int) (startValue + deltaValue * interpolatedTime));
 }

 };
 animation.setDuration(durationMillis);
 contentView.startAnimation(animation);
 }
 });
 }
또한 외부 호출 에 편리 한 몇 가지 방법 을 정의 합 니 다(텍스트 TextView 를 가 져 오고 텍스트 내용 을 직접 설정 합 니 다).또한 dip 픽 셀 을 바 꾸 는 정적 방법 도 정의 합 니 다.

 public TextView getTextView(){
 return contentView;
 }

 public void setText(CharSequence charSequence){
 contentView.setText(charSequence);
 }

 public static int dip2px(Context context, float dipValue){ 
 final float scale = context.getResources().getDisplayMetrics().density; 
 return (int)(dipValue * scale + 0.5f); 
 } 
사실 여기까지 사용자 정의 다 중 텍스트 접 기 전개 MoreTextView 가 완료 되 었 습 니 다.어떻게 사용 하나 요?
layout/xx.xml 에서 사용
방금 사용자 정의 속성 을 편리 하 게 사용 하여 값 을 정의 하려 면 xml namespace 에서 응용 을 정의 하 십시오.
자동 참조 네 임 스페이스 res-auto
xmlns:more=”http://schemas.android.com/apk/res-auto”
패키지 이름 을 직접 정의 하거나
xmlns:more=”http://schemas.android.com/apk/res/com.qiao.moretext”
네 임 스페이스 뒤에 있 는 more 즉 아래 에 서 는 사용자 정의 속성의 시작 부분 을 사용 해 야 합 니 다.
예 를 들 어 우리 의 activitymain.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:more="http://schemas.android.com/apk/res/com.qiao.moretext"
 android:id="@+id/root"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@android:color/white"
 android:orientation="vertical" >

 <com.qiao.moretext.MoreTextView
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="5dip" 
 more:textColor="@android:color/black"
 more:textSize="18dip"
 more:maxLine="3"
 more:text="@string/content"/>

</LinearLayout>
자바 에서 직접 정의 사용
위 에서 MoreTextView 를 정의 하 는 것 은 하나의 구조 방법 인 MoreTextView(Context context,AttributeSet attrs)만 정의 하기 때문에 사용 할 때 도:

 MoreTextView content = new MoreTextView(MainActivity.this, null);
 content.setText(getText(R.string.content));
 //  addview        

    ,    ,                      。 
  C> 
  MoreTextView(Context context){ 
    //           
    bindTextView(); 
  }
3.종합 서술
다시 말 하면 우 리 는 이미 실현 하고 자 하 는 기능 을 완 성 했 습 니 다.UI 로 서 그 는 좀 초라 할 수 있 지만 demo 로 서 시범 적 인 역할 을 하 는 것 만으로 도 충분 합 니 다.뒤에 우 리 는 그것 을 웨 이 보 의 한 listitem 으로 목록 을 만 들 고 좋아요 등 기능 을 추가 하 는 것 을 고려 할 수 있 습 니 다.관심 있 으 면 해 보 세 요.
원본 예제 다운로드 주소:http://xiazai.jb51.net/201610/yuanma/Androidtouchmove(jb51.net).rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기