可擴充套件的TextView,ExpandableTextView與Scroller類的使用
轉載時請註明出處,尊重他人的勞動成果,謝謝。
廢話不多說,先上圖演示下成果(圖有些醜,別見怪):
最近一直在研究Scroller類的使用方法,看了很多遍別人的例子總是感覺不得要領,最後還是自己實踐一下,這個控制元件的靈感來源於stackoverflow上一個人的提問,就是這種可擴充套件的TextView,當然,人家那個很好看,那時候感覺很神奇,自從知道Scroller這個類之後就拿它來練練手吧,大夥可以隨意更改它的效果,配對了很好看的。
附上程式碼:
package com.sahadev.sildingfinishlayout;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import android.widget.TextView;
public class ExpandableTextView extends RelativeLayout {
private TextView mTextView;
private Button mButton;
private int mTextViewId = 567576458;// 這裡注意不要隨便填一個簡單的數字,可能會和R中的ID衝突造成無效
private Scroller mScroller;
private int mHeight, mWidthMeasureSpec, mButtonHeight, paddingSize = 1;
private boolean isExpanded, WSettedFlag, HSettedFlag, onceFlag;
private int times = 2;// 縮小的倍數,預設2倍
public ExpandableTextView(Context context) {
this(context, null);
}
public ExpandableTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ExpandableTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mTextView = new TextView(context);
mTextView.setId(mTextViewId);
mButton = new Button(context);
mButton.setText("擴 展");
mScroller = new Scroller(context);
LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.BELOW, mTextViewId);
lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!isExpanded) {
// 展開來
mScroller.startScroll(0, mHeight / times, 0, mHeight / times);
postInvalidate();
isExpanded = true;
} else {
// 收回去
mScroller.startScroll(0, mHeight, 0, -mHeight / times);
postInvalidate();
isExpanded = false;
}
}
});
addView(mTextView);
addView(mButton, lp);
}
@Override
public void computeScroll() {
super.computeScroll();
if (mScroller.computeScrollOffset()) {
mTextView.setHeight(mScroller.getCurrY());
postInvalidate();
return;
}
}
public void setTimes(int times) {
if (times == 0) {
throw new ArithmeticException("倍數不能為0");
}
this.times = times;
}
public void setTextViewPadding(int pixels) {
mTextView.setPadding(pixels, pixels, pixels, 0);
paddingSize = pixels;
}
public void setButtonTips(CharSequence text) {
mButton.setText(text);
}
public void setText(CharSequence text) {
mTextView.setText(text);
}
public void setTextColor(int color) {
mTextView.setTextColor(color);
}
public void setTextSize(float size) {
mTextView.setTextSize(size);
}
public void setBackgroundColor(int color) {
mTextView.setBackgroundColor(color);
}
public void setWidth(int width) {
mWidthMeasureSpec = width;
mTextView.setWidth(width - paddingSize * 2);
WSettedFlag = true;
}
public void setHeight(int height) {
mHeight = (height - mButtonHeight) * 2;
HSettedFlag = true;
}
/* onMeasure方法在重繪的時候會一直被呼叫 */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
/* 此步驟只用執行一次,獲取到textView的寬度以及Button的高度以及一些初始化的值 */
if (!WSettedFlag) {
WSettedFlag = true;
mWidthMeasureSpec = mTextView.getMeasuredWidth();
}
if (!HSettedFlag) {
HSettedFlag = true;
mHeight = mTextView.getMeasuredHeight();
OtherTools.showLog("mHeight----" + mHeight);
}
if (!onceFlag) {
onceFlag = true;
mButtonHeight = mButton.getMeasuredHeight();
OtherTools.showLog("mButtonHeight----" + mButtonHeight);
// mTextView.setHeight(mHeight / times + mButtonHeight >
// heightMeasureSpec ? heightMeasureSpec - mButtonHeight : mHeight /
// times);
mTextView.setHeight(mHeight / times);
}
// int tempHeight = mHeight / 2 + mButtonHeight;
// tempHeight = tempHeight > heightMeasureSpec ? heightMeasureSpec :
// tempHeight;
setMeasuredDimension(mWidthMeasureSpec, mButtonHeight + mTextView.getMeasuredHeight());
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/slide"
android:layout_width="match_parent"
android:layout_height="match_parent"
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" >
<com.sahadev.sildingfinishlayout.ExpandableTextView
android:id="@+id/hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#a6c" />
</RelativeLayout>
package com.sahadev.sildingfinishlayout;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.Window;
public class MainActivity extends Activity {
private ExpandableTextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
textView = (ExpandableTextView) findViewById(R.id.hello);
textView.setText("近日,多家媒體報導,山西最大的民營企業聯盛集團董事長邢利斌被警方帶據分析,邢利斌這次被警方帶走,很可能和聯盛集團債臺高築有關。不過短短几年,山西煤老闆為何就和金融機構從蜜月期走到了劍拔弩張的田地?");
textView.setTextSize(30);
textView.setTextColor(Color.WHITE);
textView.setTextViewPadding(15);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
由於還不太會往GitHub上傳東西,大家就將就著把程式碼拷貝執行吧,有什麼疑問請在下面留言。
相關文章
- Android自定義字型--自定義TextView(可擴充套件不同ttf字Android自定義字型TextView套件
- 可擴充套件的使用者表設計套件
- 可擴充套件性套件
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- 可擴充套件的搜尋元件套件元件
- 分類擴充套件套件
- weex ios擴充套件類的作用iOS套件
- 讀構建可擴充套件分散式系統:方法與實踐15可擴充套件系統的基本要素套件分散式
- dart系列之:dart類的擴充套件Dart套件
- HttpContext擴充套件類HTTPContext套件
- C#中的擴充套件類的理解C#套件
- ETL的可擴充套件性和可維護性套件
- 實用的可選項(Optional)擴充套件套件
- dubbo是如何實現可擴充套件的?套件
- PHPWAMP安裝Redis擴充套件的方式與相關擴充套件的下載PHPRedis套件
- 編寫可擴充套件程式套件
- Redis複製與可擴充套件叢集搭建Redis套件
- php mysqli擴充套件庫的使用PHPMySql套件
- iOS開發的分類和擴充套件iOS套件
- 讀構建可擴充套件分散式系統:方法與實踐09可擴充套件資料庫基礎套件分散式資料庫
- 使用高階函式實現類的擴充套件設計函式套件
- dubbo是如何實現可擴充套件的?(二)套件
- Yahoo!Screwdriver:可擴充套件的持續整合工具套件
- 構建可擴充套件的有態服務套件
- 構建可擴充套件的應用(一) (轉)套件
- Laravel-permission(一個許可權管理的擴充套件包) 的使用Laravel套件
- C# 擴充套件方法 借籤於 Objective-C 擴充套件類.C#套件Object
- 可擴充套件Web架構與分散式系統套件Web架構分散式
- 可擴充套件性筆記一套件筆記
- 使用Kotlin + Jersey + Jetty + MongoDB建立可擴充套件的RESTful API - AndrewKotlinJettyMongoDB套件RESTAPI
- [丁原]使用Mysql來搭建可擴充套件的SNS網站(淺談)MySql套件網站
- Lambda擴充套件與用途套件
- BSGS與擴充套件BSGS套件
- Scala由類的動態擴充套件想到型別類套件型別
- Flutter——Dart Extension擴充套件方法的使用FlutterDart套件
- Java-IoUtil擴充套件工具類Java套件
- PDF 擴充套件包使用套件
- 無限級分類之Laravel-nestedset擴充套件包的使用Laravel套件