【ANDROID自定义控件】可扩展的TextView,ExpandableTextView与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());
        }
}
时间: 2024-11-01 17:53:46

【ANDROID自定义控件】可扩展的TextView,ExpandableTextView与Scroller类的使用的相关文章

Android实现可收缩和扩展的TextView

在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView. 实现原理:核心是控制TextView的max lines.在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextVi

Android自定义控件——开源组件SlidingMenu的项目集成

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39611355        在实际项目开发中,定制一个菜单,能让用户得到更好的用户体验,诚然菜单的样式各种各样,但是有一种菜单--滑动菜单,是被众多应用广泛使用的.关于这种滑动菜单的实现,我在前面的博文中也介绍了如何自定义去实现,请参考Android自定义控件--侧滑菜单,这篇博文描述的是如何从无到有创建一个侧滑菜单的控件,里面的代码不多,但是处理的逻辑和各种效果比较复杂,如果稍

Android自定义控件之自定义组合控件(三)_Android

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一).Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处?我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的. 1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码  <?xml ve

Android自定义控件之自定义组合控件(三)

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一).Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的.  1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xml v

Android自定义控件之组合控件学习笔记分享_Android

我们来讲一下自定义组合控件,相信大家也接触过自定义组合控件吧,话不多说,直接干(哈~哈~): 大家看到这个觉得这不是很简单的吗,这不就是写个布局文件就搞定嘛,没错,确实直接上布局就行,不过,我只是用这个简单的例子来讲一下自定义组合控件的用法. 首先看看,这一行行的条目看起来都长得差不多,只是图片和文字不一样,没错,就是看中这一点,我们可以把一个条目做成一个组合控件,做为一个整体,这样不管你有几个条目,就写几个组合控件就行了. 步骤: 1.先建立组合控件的布局 myView.xml <Relati

布局-Android自定义控件在scrollview中设置高度不起作用,已经重写了 onMeasure方法

问题描述 Android自定义控件在scrollview中设置高度不起作用,已经重写了 onMeasure方法 布局: android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <RelativeLayout android:layout_width="match_parent&q

edittext bitmap-我想在Android中利用EditText(TextView)实现在控件的最右边添加一张位图。。

问题描述 我想在Android中利用EditText(TextView)实现在控件的最右边添加一张位图.. 解决方案 外面一个FramLayou框起来就解决了 解决方案二: 最好的是自定控件,通过canvas画上去,或者再简单点就是做个背景图你懂的 解决方案三: 给你的edittext设置一个下面这个属性,试试 android:drawableRight="@drawable/right_icon" 解决方案四: Android控件之TextView和EditTextAndroid系统

详解Android自定义控件属性_Android

在Android开发中,往往要用到自定义的控件来实现我们的需求或效果.在使用自定义 控件时,难免要用到自定义属性,那怎么使用自定义属性呢? 在文件res/values/下新建attrs.xml属性文件,中定义我们所需要的属性. <?xml version="1.0" encoding="utf-8"?> <resources><!-- resource是跟标签,可以在里面定义若干个declare-styleable --> <

Android自定义控件之基本原理(一)_Android

前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自定义控件要求: 1. 应当遵守Android标准的规范(命名,可配置,事件处理等). 2. 在XML布局中科配置控件的属性. 3. 对交互应当有合适的反馈,比如按下,点击等. 4. 具有兼容性, Android版本很多,应该具有广泛的适用性. 自定义控件学习步骤: 1 .View的工作原理 2 .编