可扩展的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() {@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上传东西,大家就将就着把代码拷贝运行吧,有什么疑问请在下面留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件系列(三):主流的消息队列中间件有哪些?

消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。 当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#xff0c;炙手可热的Kafka&#…

谷歌40人发表59页长文:为何真实场景中ML模型表现不好?

文 | 白鹡鸰编 | 夕小瑶大家好哇&#xff0c;我是上周那篇《NLP太卷了&#xff0c;我去研究蛋白质了》的漫画作者白鹡鸰~前不久&#xff0c;在卖萌屋NLP群里默默潜水的白鹡鸰被群友提到的一篇Google几天前放出的59页超长论文炸得飞了起来。来&#xff0c;大家来感受一下气势浩大…

圆形进度条以及百分率指示器 Scroller类的练习

转载时请注明出处&#xff0c;尊重他人的劳动成果&#xff0c;谢谢。 先附上效果图&#xff1a; 这个控件是动态加载到75%的&#xff0c;主要我忘了怎么做动态图&#xff0c;就先放一个静态图在这里表示表示。旁边这个没有没有喜欢的&#xff1f;有想知道的 我可以告诉答案。…

阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

本文涉及的内容以及知识点如下&#xff1a; 1、单体架构 2、单体架构的拆分 3、SOA与微服务的区别 4、微服务的优缺点 5、微服务的消息 6、服务集成 7、数据的去中心化 单体架构 Web应用程序发展的早期&#xff0c;大部分web工程是将所有的功能模块&#xff08;service…

我拿乐谱训了个语言模型!

文 | 花椒最近在刷EMNLP论文的时候发现一篇非常有趣的论文《Learning Music Helps You Read: Using Transfer to Study Linguistic Structure in Language Models》&#xff0c;来自斯坦福大学NLP组。论文有趣的发现是让语言模型先在乐谱上进行训练&#xff0c;再在自然语言上训…

LeetCode 146. LRU缓存机制(哈希链表)

文章目录1. 题目信息2. 解题2.1 手动实现list2.2 使用内置list1. 题目信息 运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作&#xff1a; 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓…

微服务系列:服务注册与发现的实现原理、及实现优劣势比较

服务注册与发现的来源 首先&#xff0c;服务注册与发现是来自于微服务架构的产物。 在传统的服务架构中&#xff0c;服务的规模处于运维人员的可控范围内。当部署服务的多个节点时&#xff0c;一般使用静态配置的方式实现服务信息的设定。而在微服务应用中&#xff0c;服务实例…

EMNLP 2020论文分析:知识图谱增强语言模型或是未来的发展趋势!

文 | Michael Galkin源 | AI科技评论在EMNLP 2020的论文投递中&#xff0c;知识图谱的研究热度不减&#xff0c;并成为继续推动NLP发展的重要动力之一。在EMNLP 2020中&#xff0c;知识图谱领域有了哪些最新研究进展呢&#xff1f;作者从中选出了30篇文章&#xff0c;对未来2-3…

如何通过反射来解决AlertDialog标题由于字数过多显示不全的问题

转载前请标明出处:http://blog.csdn.net/sahadev_ 先上一下示例图&#xff1a; 这是默认状态下&#xff1a;这是通过反射后修改的结果&#xff1a; 在解决这个问题之前首先需要了解一下AlertDialog的基本构造&#xff0c;所以先从源码看起&#xff1a; 想要知道为什么显示不…

LeetCode 292. Nim 游戏

文章目录1. 题目信息2. 解题1. 题目信息 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a;桌子上有一堆石头&#xff0c;每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人&#xff0c;每一步都是最优解。 编写一个函数…

配送A/B评估体系建设实践

2019年5月6日&#xff0c;美团点评正式推出新品牌“美团配送”&#xff0c;发布了美团配送新愿景&#xff1a;“每天完成一亿次值得信赖的配送服务&#xff0c;成为不可或缺的生活基础设施。”现在&#xff0c;美团配送已经服务于全国400多万商家和4亿多用户&#xff0c;覆盖28…

ListView原理简单介绍(着重介绍getView被调用的一系列过程)

今天出去面试&#xff0c;被面试官问到一个问题&#xff0c;说是如果使用 LayoutInflate.inflate(int resource, ViewGroup root, boolean attachToRoot);这个方法与AbsListView的实现类结合使用的话&#xff0c;会出现什么问题&#xff0c;先看简单的使用过程&#xff1a; Ove…

一人之力,刷爆三路榜单!信息抽取竞赛夺冠经验分享

文 | JayLou娄杰在现如今的NLP竞赛中&#xff0c;信息抽取&#xff08;IE&#xff09;任务已占据半壁江山。来&#xff0c;让我们看看今年的一些IE竞赛都有啥&#xff1a;看到如此众多的IE竞赛&#xff0c;心动的JayJay抽空参加了CHIP2020&#xff08;中国健康信息处理大会&…

pkuseg:一个多领域中文分词工具包

pkuseg简单易用&#xff0c;支持细分领域分词&#xff0c;有效提升了分词准确度。 目录 主要亮点编译和安装各类分词工具包的性能对比使用方式相关论文作者常见问题及解答主要亮点 pkuseg具有如下几个特点&#xff1a; 多领域分词。不同于以往的通用中文分词工具&#xff0c;此…

积木Sketch Plugin:设计同学的贴心搭档

| A consistent experience is a better experience.——Mark Eberman | 一致的体验是更好的体验。——Mark Eberman 《摘自设计师的16句名言》 背景 1.UI一致性项目 积木&#xff08;Tangram&#xff09;Sketch插件源于美团外卖UI的一致性项目&#xff0c;该项目自2019年5月份…

简单讲述一下Intent的传值过程

昨晚带女友Android入门&#xff0c;她本是照着一本书敲得&#xff0c;可以运行&#xff0c;后来她自己凭思维自己写了一个&#xff0c;然后出现了值没有传过来的问题&#xff0c;然后简单的了解了一下Intent是如何传递数据的。 我们的例子是这样的&#xff1a; 由A Activity通…

何恺明团队:stop gradient是孪生网络对比学习成功的关键

文 | Happy源 | 极市平台本文是FAIR的陈鑫磊&何恺明大神在无监督学习领域又一力作&#xff0c;提出了一种非常简单的表达学习机制用于避免表达学习中的“崩溃”问题&#xff0c;从理论与实验角度证实了所提方法的有效性&#xff1b;与此同时&#xff0c;还侧面证实了对比学…

美团无人配送CVPR2020论文CenterMask解读

计算机视觉技术是实现自动驾驶的重要部分&#xff0c;美团无人配送团队长期在该领域进行着积极的探索。不久前&#xff0c;高精地图组提出的CenterMask图像实例分割算法被CVPR2020收录&#xff0c;本文将对该方法进行介绍。 CVPR的全称是IEEE Conference on Computer Vision an…

如何使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率

在平常的开发中经常会有很多列表页面&#xff0c;每做一个列表页就需要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件。如果版本更新迭代比较频繁&#xff0c;如此以往&#xff0c;就会使项目工程变得无比庞大臃肿。 如果看过这篇文章或者…

从信息检索顶会CIKM'20看搜索、推荐与计算广告新进展

文 | 谷育龙Eric源 | 搜索推荐广告排序艺术我是谷育龙Eric&#xff0c;研究方向有深度学习、搜索推荐&#xff0c;喜欢为大家分享深度学习在搜索推荐广告排序应用的文章。CIKM作为信息检索、数据挖掘等领域的国际一流会议&#xff0c;每年都有很多搜索推荐广告领域的精彩论文。…