转载时请注明出处,尊重他人的劳动成果,谢谢。

废话不多说,先上图演示下成果(图有些丑,别见怪):

最近一直在研究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() {@Overridepublic 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);}@Overridepublic 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方法在重绘的时候会一直被调用 */@Overrideprotected 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.ExpandableTextViewandroid: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;@Overrideprotected 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);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}}

由于还不太会往GitHub上传东西,大家就将就着把代码拷贝运行吧,有什么疑问请在下面留言。

可扩展的TextView,ExpandableTextView与Scroller类的使用相关推荐

  1. Android自己定义组件系列【2】——Scroller类

    在上一篇中介绍了View类的scrollTo和scrollBy两个方法,对这两个方法不太了解的朋友能够先看<自己定义View及ViewGroup> scrollTo和scrollBy尽管实 ...

  2. Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)...

    在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现..   例子相关博文:Androi ...

  3. 简单的ViewPager了解Scroller类

    View滑动是自定义ViewGroup中十分常见的一个功能.Android提供了多种View滑动的方法. layout方法 offsetLeftAndRight()与offsetTopAndBotto ...

  4. android 最新消息滚动,Android 滚动操作Scroller类详解

    Scroller这个类理解起来有一定的困难,刚开始接触Scroller类的程序员可能无法理解Scroller和View系统是怎么样联系起来的.我经过自己的学习和实践,对Scroller的用法和工作原理 ...

  5. Android平滑移动——Scroller类研究

    Scroller是Android中View平滑移动的一个辅助类,对于刚接触Scroller的人群来说它可能难以理解: 1.它是怎样滑动View的(如何与View关联的)? 2.又是谁触发了它? 其实要 ...

  6. Android Scroller类的详细分析

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/7321910 Scroller这个类理解起来有一定的困难,刚开始接触Scrol ...

  7. [原] Android中Scroller类的分析

    今天看了一下项目中用到的ViewFlow控件,想弄明白其工作原理.从头开始分析,卡在"滚动"这儿了. 做android也快两年了,连最基本的滚动都不熟悉,真是惭愧...遂网上找资料 ...

  8. Scroller类的源码分析以及使用

    Scroller类是用于处理滚动效果的一个类,我们平时使用的ViewPager,可以触摸左右滑动页面,其内部就是使用了Scroller.由于Scroller类是配合View或者ViewGroup的子类 ...

  9. Scroller类源码解析及其应用(一)

    滑动是我们在自定义控件时候经常遇见的难题,让新手们倍感困惑,这篇文章主要介绍Scroller类的源码,告诉打击这个到底有什么用,怎么使用它来控制滑动.另外,我还会结合一个简单的例子,来看一下这个类的应 ...

最新文章

  1. Springboot的部分依赖及作用
  2. SpringBoot数据访问配置
  3. python3读写excel文件_Python读写/追加excel文件Demo
  4. Kickstart无人职守安装RHEL6.4
  5. C/C++排序算法(2)希尔排序
  6. 强制推送代码到远程仓库
  7. 计算机记录乐器声音的文件是,一、用计算机录音的过程.pptx
  8. Jquery 中 ajaxSubmit使用笔记
  9. 音频信号频率测试软件,音频测试信号频率详细解说
  10. ubuntu 安装opensips osip exosip
  11. SpringBoot搭建个人博客v1.0 - 博客管理功能实现(七)
  12. JavaScript实现节点的增加修改删除查找
  13. IVCam:电脑调用你的手机摄像头
  14. 不联网计算机软件升级,不能联网的电脑如何升级病毒库
  15. 世界顶级食材——挑动你的食欲
  16. 计算机网络施工组织设计,网络综合布线施工组织设计方案书.doc
  17. excel数据可视化销售报表案例--根据某平台提供的明细数据及需求制作的一份销售报表案例
  18. Linux下开启/关闭MySql Server
  19. 时间序列 工具库学习(6) Darts模块-使用DataTransformer和Pipelin进行数据预处理
  20. [C++] MFC编写局域网远程控制 ,50行代码轻松搞定!

热门文章

  1. 文件断点续传原理与实现
  2. 动画讲解C语言的指针,从未如此简单
  3. 乔布斯,影响了一个时代的人
  4. 可以在中断服务程序执行malloc吗?
  5. Linux kernel同步机制
  6. php中goto另一个页面,php中goto操作符的详细介绍
  7. cv2.dnn.readNetFromDarknet()在python3上遇到的问题
  8. 数据结构之图:加权无向图与寻找最小生成树,Python——27
  9. pip install时发生raise ReadTimeoutError(self._pool, None, 'Read timed out.')的解决方案
  10. 程序员面试金典 - 面试题 08.10. 颜色填充(BFS/DFS)