亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android開發之仿微信顯示更多文字的View

2019-11-09 17:53:34
字體:
來源:轉載
供稿:網友
    最近開發需求中要模仿微信朋友圈文章的展開收起功能,網上找了找,發現都有問題,于是乎自己在前輩的基礎上進行了一定量的修改,下邊將源碼貼出來供大家參考:1.主Activity布局文件就不粘貼了,很簡單,就一個ListView.2.主Activity功能實現:<font face="宋體" size="3">package com.example.textviewdemo;  import java.util.HashMap;  import android.app.Activity;  import android.content.Context;  import android.os.Bundle;  import android.view.LayoutInflater;  import android.view.View;  import android.view.ViewGroup;  import android.widget.BaseAdapter;  import android.widget.ListView;  import android.widget.TextView;  import android.widget.TextView.BufferType;    public class MainActivity extends Activity {  String mStr;  int type;    @Override  PRotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  Globl.map = new HashMap<Integer, Boolean>();  ListView listview = (ListView) findViewById(R.id.listview);  mStr = "手指在ListView上下滾動時,ListViewItem背景變黑,因為在滾動的時候為了提升性能做了優化,為提高滾動的性能,Android 框    架在ListView中引入CacheColorHint屬性。如果該值為非0,則說明該ListView繪制在單色不透明的背景上,在默認情況下該值 為        #191919,也就是黑色主題中的黑色背景顏色值,這樣當ListView滾動的時候";      listview.setAdapter(new MyListAdpter(this));  }  class MyListAdpter extends BaseAdapter {  Context con;  CollapsibleTextView tv;    public MyListAdpter(Context con) {      this.con = con;  }    @Override  public int getCount() {      // TODO Auto-generated method stub      return 10;  }    @Override  public Object getItem(int position) {      // TODO Auto-generated method stub      return null;  }    @Override  public long getItemId(int position) {      // TODO Auto-generated method stub      return 0;  }    HashMap<Integer, View> hashM = new HashMap<Integer, View>();  @Override  public View getView(int position, View convertView, ViewGroup parent) {  Holder holder = null;  View view;  if (hashM.get(position) == null) {      holder = new Holder();      view = LayoutInflater.from(con).inflate(R.layout.item_list, null);      holder.tv = (CollapsibleTextView) view.findViewById(R.id.tv_text);      holder.tvcount = (TextView) view.findViewById(R.id.tvcount);      view.setTag(holder);      hashM.put(position, view);  } else {      view = hashM.get(position);      holder = (Holder) view.getTag();  }    // if (Globl.map.get(position) == false) {  // Globl.map.put(position, false);  // type = 2;  // } else {  // type = 1;  // }  // tv.setNowType(type);  // int typeNow = tv.getNowType();      holder.tvcount.setText(position + "");      holder.tv.setDesc(mStr, holder.tv, BufferType.NORMAL);      return view;  }    class Holder {      CollapsibleTextView tv;      TextView tvcount;  }  }    } 3.自定義控件CollapsibleTextView 源碼:<font face="宋體" size="3">/** * @Explain: Text過長收起 帶有查看全文/收起功能控件; * @Author:LYl * @Time:2014-11-27 下午4:33:05 * @Version V2.1.54 */  public class CollapsibleTextView extends LinearLayout implements  OnClickListener {  /** 最大顯示的行數 */  private static final int DEFAULT_MAX_LINE_COUNT = 8;  /** 實際展示的行數 */  private static final int DEFAULT_SHOW_LINE_COUNT = 6;      private static final int COLLAPSIBLE_STATE_NONE = 0;  /** View處于展開狀態 **/  private static final int COLLAPSIBLE_STATE_SHRINKUP = 1;  /** view收縮時狀態 **/  private static final int COLLAPSIBLE_STATE_SPREAD = 2;  /** 顯示內容的View */  private TextView tv_context;  /** 展開/收起按鈕 */  private TextView bt_spread;  private String shrinkup;  private String spread;  /** 當前正處于的狀態 */  // private int mState;  private boolean flag;  private int nowType;  private CollapsibleTextView coTextView;  /** 判斷是不是點擊了查看更多、收起 */  private boolean isClicke = false;  private int lookCount = 0;    public CollapsibleTextView(Context context, AttributeSet attrs) {  super(context, attrs);  shrinkup = "收起";  spread = "查看全文";  View view = inflate(context, R.layout.collapsible_textview, this);  view.setPadding(0, -1, 0, 0);  tv_context = (TextView) view.findViewById(R.id.tv_context);  bt_spread = (TextView) view.findViewById(R.id.bt_spread);  bt_spread.setOnClickListener(this);  }    public CollapsibleTextView(Context context) {  this(context, null);  }    /** * 賦值 */  public final void setDesc(CharSequence charSequence,  CollapsibleTextView tv, BufferType bufferType) {  this.coTextView = tv;  // 對內容中的網址進行處理;  tv_context.setAutoLinkMask(Linkify.WEB_URLS);  tv_context.setMovementMethod(LinkMovementMethod.getInstance());  tv_context.setText(charSequence, bufferType);  // 初始類型  if (lookCount == 0) {  coTextView.setNowType(COLLAPSIBLE_STATE_SPREAD);  }  lookCount += 1;  // TODO LYL 放到ListView中需要加下句:falg=false;一般情況去掉就可  flag = false;  requestLayout();  }      @Override  public void onClick(View v) {  flag = false;  isClicke = true;  requestLayout();  }      @Override  protected void onLayout(boolean changed, int l, int t, int r, int b) {  super.onLayout(changed, l, t, r, b);  if (!flag) {  flag = true;  if (tv_context.getLineCount() <= DEFAULT_MAX_LINE_COUNT) {  bt_spread.setVisibility(View.GONE);  tv_context.setMaxLines(DEFAULT_MAX_LINE_COUNT + 1);  coTextView.setNowType(COLLAPSIBLE_STATE_NONE);  } else {  post(new InnerRunnable());      }  }  }      class InnerRunnable implements Runnable {  @Override  public void run() {  int zType = 0;  // 第一次進入操作(沒有點擊并且是第一次進入);  System.out.println("lookCount:" + lookCount);  if (!isClicke && lookCount == 1) {  if (coTextView.getNowType() == COLLAPSIBLE_STATE_SPREAD) {  tv_context.setMaxLines(DEFAULT_SHOW_LINE_COUNT);  bt_spread.setVisibility(View.VISIBLE);  bt_spread.setText(spread);  zType = COLLAPSIBLE_STATE_SHRINKUP;  } else if (coTextView.getNowType() == COLLAPSIBLE_STATE_SHRINKUP) {  tv_context.setMaxLines(Integer.MAX_VALUE);  bt_spread.setVisibility(View.VISIBLE);  bt_spread.setText(shrinkup);  zType = COLLAPSIBLE_STATE_SPREAD;  }  coTextView.setNowType(zType);  // 點擊了查看更多、收起轉換狀態;  } else if (isClicke) {  isClicke = false;  if (coTextView.getNowType() == COLLAPSIBLE_STATE_SPREAD) {  tv_context.setMaxLines(DEFAULT_SHOW_LINE_COUNT);  bt_spread.setVisibility(View.VISIBLE);  bt_spread.setText(spread);  coTextView.setNowType(COLLAPSIBLE_STATE_SHRINKUP);  } else if (coTextView.getNowType() == COLLAPSIBLE_STATE_SHRINKUP) {  tv_context.setMaxLines(Integer.MAX_VALUE);  bt_spread.setVisibility(View.VISIBLE);  bt_spread.setText(shrinkup);  coTextView.setNowType(COLLAPSIBLE_STATE_SPREAD);  }  // 滑動listView 從新載入到可見界面 不做操作,保持原有狀態;(為了后面看得人能夠更理解寫上)  } else if (!isClicke && lookCount != 1) {    }    }  }      public int getNowType() {  return nowType;  }      public void setNowType(int nowType) {  this.nowType = nowType;  }    }public class CollapsiblePanel extends LinearLayout {    /**     * TAG     */    private static final String TAG = "CollapsiblePanel";    /**     * DEBUG     */    private static final boolean DEBUG = BuildConfig.DEBUG;    /**     * 內容View     */    private View mContentView;    /**     * 可收縮的View     */    private View mCollapsibleView;    /**     * 可收縮的大小     */    private int mCollapsibleSize;    /**     * 收縮的監聽器     */    private OnCollapsibleListener mCollapsibleListener;    /**     * 收縮動畫的時間     */    private int mAnimDuration = 0;  //SUPPRESS CHECKSTYLE    /**     * 判斷當前可收縮View是否是打開狀態     */    private boolean mIsOpened = false;    /**     * 可收縮View默認是否可見     */    private boolean mCollapsibleViewDefaultVisible = false;    /**     * Toggle是否可用     */    private boolean mToggleEnable = true;    /**     * 不使用Alpha動畫     */    private boolean mWithoutAlphaAnim = true;    /**     * 收縮是否有動畫效果     */    private boolean mDoAnimation = true;    public interface OnCollapsibleListener {        /**         * 動畫結束監聽         *         * @param isOpened 當前的stretchView是否是打開的,         */        void onCollapsibleFinished(boolean isOpened);        /**         * 動畫過程中使用Transformation的接口         *         * @param from             from         * @param to               to         * @param interpolatedTime interpolatedTime         */        void applyTransformation(int from, int to, float interpolatedTime);    }    /**     * 構造方法     *     * @param context context     */    public CollapsiblePanel(Context context) {        super(context);        init(context, null);    }    /**     * 構造方法     *     * @param context context     * @param attrs   attrs     */    public CollapsiblePanel(Context context, AttributeSet attrs) {        super(context, attrs);        init(context, attrs);    }    /**     * 構造方法     *     * @param context  context     * @param attrs    attrs     * @param defStyle defStyle     */    @SuppressLint("NewApi")    @TargetApi(Build.VERSION_CODES.HONEYCOMB)    public CollapsiblePanel(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init(context, attrs);    }    /**     * 初始化     *     * @param context context     * @param attrs   attrs     */    private void init(Context context, AttributeSet attrs) {        setOrientation(LinearLayout.VERTICAL);        mAnimDuration = 280;    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        if (mCollapsibleSize == 0 && mCollapsibleView != null) {            mCollapsibleView.measure(widthMeasureSpec, MeasureSpec.UNSPECIFIED);            if (LinearLayout.VERTICAL == getOrientation()) {                mCollapsibleSize = mCollapsibleView.getMeasuredHeight();                if (!mCollapsibleViewDefaultVisible) {                    mCollapsibleView.getLayoutParams().height = 0;                }            } else {                mCollapsibleSize = mCollapsibleView.getMeasuredWidth();                if (!mCollapsibleViewDefaultVisible) {                    mCollapsibleView.getLayoutParams().width = 0;                }            }        }        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    /**     * 設置控件初始時是否可見     *     * @param visible 是否可見     */    public void setCollapsibleViewDefaultVisible(boolean visible) {        mCollapsibleViewDefaultVisible = visible;        // 默認可見的話,則認為是展開的        mIsOpened = visible;    }    /**     * 控件初始時是否可見     *     * @return visible     */    public boolean getCollapsibleViewDefaultVisible() {        return mCollapsibleViewDefaultVisible;    }    /**     * 設置toggle是否可用,如果設置為false,則{@link #toggle()}接口無效     *     * @param enable enable     */    public void setToggleEnable(boolean enable) {        mToggleEnable = enable;    }    /**     * 獲取當前的主View     *     * @return view     */    public View getContentView() {        return mContentView;    }    /**     * 獲取當前的擴展View     *     * @return view     */    public View getStretchView() {        return mCollapsibleView;    }    /**     * 設置主View     *     * @param view view     */    public void setContentView(View view) {        if (view != null) {            if (mContentView != null) {                removeView(this.mContentView);            }            mContentView = view;            addView(mContentView, 0);        }    }    /**     * 設置收縮的View     *     * @param collapsibleView 可以收縮的View     */    public void setCollapsibleView(View collapsibleView) {        if (collapsibleView != null) {            if (mCollapsibleView != null) {                removeView(mCollapsibleView);                // 在重新設置時,將該值置為0,否則新view將不能顯示正確的高度                mCollapsibleSize = 0;            }            mCollapsibleView = collapsibleView;            addView(mCollapsibleView);        }    }    /**     * 得到可收縮View的大小     *     * @return 可收縮View的大小     */    public int getCollapsibleSize() {        return mCollapsibleSize;    }    /**     * 設置收縮的監聽     *     * @param listener listener     */    public void setOnCollapsibleListener(OnCollapsibleListener listener) {        mCollapsibleListener = listener;    }    /**     * 當前的視圖是否已經展開     *     * @return true/false     */    public boolean isCollapsibleViewOpened() {        return mIsOpened;    }    /**     * 設置展開(或者收縮)動畫的時間,默認280ms     *     * @param durationMs durationMs     */    public void setCollapsibleAnimDuration(int durationMs) {        if (durationMs >= 0) {            mAnimDuration = durationMs;        } else {            throw new IllegalArgumentException("Animation duration cannot be negative");        }    }    /**     * 展開/收起View     *     * @return true/false     */    public boolean toggle() {        // 如果不允許展開        if (!mToggleEnable) {            return false;        }        // 如果動畫正在進行,不執行任何操作        if (isAnimationPlaying()) {            return false;        }        if (mIsOpened) {            closeCollapsibleView();        } else {            openCollapsibleView();        }        return true;    }    /**     * 展開視圖     */    public void openCollapsibleView() {        if (mCollapsibleView == null) {            return;        }        post(new Runnable() {            @Override            public void run() {                if (mDoAnimation) {                    CollapsibleAnimation animation = new CollapsibleAnimation(0, mCollapsibleSize, 0.0f, 1.0f);                    animation.setDuration(mAnimDuration);                    animation.setAnimationListener(mCollapsibleAnimListener);                    mCollapsibleView.startAnimation(animation);                    invalidate();                } else {                    setCollapsibleViewSize(mCollapsibleSize);                    onCollapsibleEnd();                }            }        });    }    /**     * 收起視圖     */    public void closeCollapsibleView() {        if (mCollapsibleView == null) {            return;        }        post(new Runnable() {            @Override            public void run() {                if (mDoAnimation) {                    CollapsibleAnimation animation = new CollapsibleAnimation(mCollapsibleSize, 0, 1.0f, 0.0f);                    animation.setDuration(mAnimDuration);                    animation.setAnimationListener(mCollapsibleAnimListener);                    mCollapsibleView.startAnimation(animation);                    invalidate();                } else {                    setCollapsibleViewSize(0);                    onCollapsibleEnd();                }            }        });    }    /**     * 收縮View展開或收縮時調用     *     * @param isOpened isOpened     */    protected void onCollapsibleFinished(boolean isOpened) {    }    /**     * 重置大小     */    protected void resetCollapsibleSize() {        mCollapsibleSize = 0;        requestLayout();    }    /**     * 設置收縮View的大小     *     * @param size size     */    private void setCollapsibleViewSize(int size) {        if (null == mCollapsibleView) {            return;        }        LayoutParams params = (LayoutParams) mCollapsibleView.getLayoutParams();        if (null != params) {            if (LinearLayout.VERTICAL == getOrientation()) {                params.height = size;            } else {                params.width = size;            }            mCollapsibleView.setLayoutParams(params);        }    }    /**     * 判斷動畫是否正在播放     *     * @return true/false     */    private boolean isAnimationPlaying() {        if (null != mCollapsibleView) {            Animation anim = mCollapsibleView.getAnimation();            if (null != anim && !anim.hasEnded()) {                return true;            }        }        return false;    }    /**     * 動畫的監聽器     */    private AnimationListener mCollapsibleAnimListener = new AnimationListener() {        @Override        public void onAnimationStart(Animation animation) {        }        @Override        public void onAnimationRepeat(Animation animation) {        }        @Override        public void onAnimationEnd(Animation animation) {            onCollapsibleEnd();        }    };    /**     * 收縮結束時調用     */    private void onCollapsibleEnd() {        mIsOpened = !mIsOpened;        if (mCollapsibleListener != null) {            mCollapsibleListener.onCollapsibleFinished(mIsOpened);        }        if (null != mCollapsibleView) {            mCollapsibleView.setAnimation(null);        }        onCollapsibleFinished(mIsOpened);    }    /**     * 伸縮動畫     */    private class CollapsibleAnimation extends Animation {        /**         * 開始的大小         */        private int mFromSize;        /**         * 結束的大小         */        private int mToSize;        /**         * 開始的Alpha         */        private float mFromAlpha;        /**         * 結束的Alpha         */        private float mToAlpha;        /**         * 構造方法         *         * @param fromSize  初始的大小         * @param toSize    結束的大小         * @param fromAlpha 初始的透明度         * @param toAlpha   結束的透明度         */        public CollapsibleAnimation(int fromSize, int toSize, float fromAlpha, float toAlpha) {            mFromSize = fromSize;            mToSize = toSize;            mFromAlpha = fromAlpha;            mToAlpha = toAlpha;        }        @Override        public boolean willChangeBounds() {            return true;        }        @Override        protected void applyTransformation(float interpolatedTime, Transformation t) {            if (mCollapsibleView != null) {                if (mWithoutAlphaAnim) {                    // Do nothing                } else {                    // 改變透明度                    final float alpha = mFromAlpha;                    t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime));                }                // 改變大小                final int fromSize = mFromSize;                int size = (int) (fromSize + (mToSize - fromSize) * interpolatedTime);                setCollapsibleViewSize(size);                if (null != mCollapsibleListener) {                    mCollapsibleListener.applyTransformation(mFromSize, mToSize, interpolatedTime);                }            }        }    }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美丰满少妇xxxxx做受| 91在线免费网站| 国产精品日日摸夜夜添夜夜av| 2019国产精品自在线拍国产不卡| 国产精品私拍pans大尺度在线| 欧美高清电影在线看| 欧美国产日韩二区| 国产欧美最新羞羞视频在线观看| 欧美精品激情在线观看| 亚洲欧美成人在线| 国产精品自拍视频| 国产精品免费福利| 国产丝袜精品第一页| 亚洲人av在线影院| 亚洲天堂av综合网| 91精品久久久久久久久不口人| 国产亚洲精品va在线观看| 日韩精品欧美激情| 亚洲成人中文字幕| 91tv亚洲精品香蕉国产一区7ujn| 亚洲成人精品视频在线观看| 亚洲色图第三页| 自拍偷拍免费精品| 欧美做爰性生交视频| 国产精品av电影| 欧美极品少妇xxxxⅹ喷水| 91精品久久久久久久久久久久久| 成人久久久久久| 久久精品福利视频| 国产97在线视频| 夜色77av精品影院| 3344国产精品免费看| 国产日韩欧美中文| 亚洲新中文字幕| 尤物99国产成人精品视频| 亚洲91精品在线观看| 欧美成人免费网| 国产www精品| 亚洲国产精品一区二区久| 国产69精品久久久久9999| 中文字幕日韩精品有码视频| 亚洲一区二区三区毛片| 久久亚洲欧美日韩精品专区| 国产91精品视频在线观看| 亚洲最大中文字幕| 欧美中文在线视频| 久久久久久久久久久久久久久久久久av| 欧美大全免费观看电视剧大泉洋| 精品久久久久久国产| 久久在精品线影院精品国产| 国产精品视频地址| 性欧美亚洲xxxx乳在线观看| 欧美性受xxxx白人性爽| 国产精品1区2区在线观看| 日韩欧美中文在线| 成人亚洲综合色就1024| 日韩有码在线电影| 日韩精品视频三区| 亚洲国产小视频在线观看| 亚洲国产另类久久精品| 亚洲男人av电影| 色综合导航网站| 欧美视频在线观看免费| 日韩av一区二区在线| 日韩欧美a级成人黄色| 久久久久久久久久久亚洲| 亚洲欧美一区二区三区四区| 亚洲欧洲日产国码av系列天堂| 欧美激情一区二区久久久| 日本精品视频在线观看| 欧美激情啊啊啊| 日韩精品一二三四区| 国产精品久久久久久av福利| 国产一区二区免费| 国产精品电影在线观看| 日日狠狠久久偷偷四色综合免费| 亚洲男人的天堂在线| 91精品久久久久久久久| 91精品国产777在线观看| 一区二区三区无码高清视频| 亚洲石原莉奈一区二区在线观看| 欧美日韩不卡合集视频| 欧美亚洲成人精品| 日韩av综合网站| 亚洲欧洲日产国产网站| 国产精品久久999| 国产亚洲日本欧美韩国| 亚洲激情免费观看| 在线观看精品国产视频| 欧美国产精品人人做人人爱| 欧美国产日韩在线| 国产精品久久一区| 国产精品69精品一区二区三区| 国产精品国产三级国产专播精品人| 久久国产天堂福利天堂| 欧美刺激性大交免费视频| 国产精品免费小视频| 国产精品h片在线播放| 久久五月情影视| 欧美日本亚洲视频| 欧美区在线播放| 91综合免费在线| 亚洲女人天堂成人av在线| 欧美大荫蒂xxx| 性色av香蕉一区二区| 丁香五六月婷婷久久激情| 色青青草原桃花久久综合| 久精品免费视频| 久久久91精品国产一区不卡| 久久免费视频网| 精品人伦一区二区三区蜜桃网站| 日韩欧美国产骚| www.xxxx欧美| 久久夜色精品国产亚洲aⅴ| 亚洲欧美在线一区二区| 日韩高清电影免费观看完整| 日韩69视频在线观看| 91爱爱小视频k| 国产精品自产拍在线观看中文| 久久久久久久一区二区三区| 欧美激情一区二区三区高清视频| 欧美又大粗又爽又黄大片视频| 亚洲精品av在线播放| 亚洲欧洲在线观看| 国产亚洲欧美另类中文| 国产精品欧美激情在线播放| 欧美性受xxx| 欧美成人精品在线播放| 亚洲欧美一区二区三区在线| 亚洲一区二区三区sesese| 国产视频久久网| 亚洲成色777777在线观看影院| 国产精品一区二区久久| 成人欧美一区二区三区黑人| 亚洲女人天堂av| 欧美大片欧美激情性色a∨久久| 国产精品亚洲视频在线观看| 91精品国产777在线观看| 国产精品7m视频| 欧美性生交大片免网| 欧美成人久久久| 性欧美xxxx视频在线观看| 成人福利在线观看| 欧美国产日韩一区二区三区| 国产黑人绿帽在线第一区| 国产免费一区二区三区在线能观看| 91精品免费视频| 亚洲美女精品久久| 91sao在线观看国产| 亚洲欧美在线免费观看| 亚洲精品视频在线播放| 日韩成人在线免费观看| 亚洲国产另类久久精品| 久久精品视频在线播放| 欧美精品在线播放| 4438全国亚洲精品在线观看视频| 欧美高清videos高潮hd| 国产日韩在线看片| www欧美日韩| 久久精品中文字幕电影| 亚洲男人天堂手机在线| 国产精品高潮呻吟久久av野狼| 日韩一中文字幕| 日韩经典中文字幕在线观看|