麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)之仿微信顯示更多文字的View

2019-11-09 17:53:34
字體:
供稿:網(wǎng)友
    最近開發(fā)需求中要模仿微信朋友圈文章的展開收起功能,網(wǎng)上找了找,發(fā)現(xiàn)都有問題,于是乎自己在前輩的基礎(chǔ)上進(jìn)行了一定量的修改,下邊將源碼貼出來供大家參考:1.主Activity布局文件就不粘貼了,很簡(jiǎn)單,就一個(gè)ListView.2.主Activity功能實(shí)現(xiàn):<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上下滾動(dòng)時(shí),ListViewItem背景變黑,因?yàn)樵跐L動(dòng)的時(shí)候?yàn)榱颂嵘阅茏隽藘?yōu)化,為提高滾動(dòng)的性能,Android 框    架在ListView中引入CacheColorHint屬性。如果該值為非0,則說明該ListView繪制在單色不透明的背景上,在默認(rèn)情況下該值 為        #191919,也就是黑色主題中的黑色背景顏色值,這樣當(dāng)ListView滾動(dòng)的時(shí)候";      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 {  /** 最大顯示的行數(shù) */  private static final int DEFAULT_MAX_LINE_COUNT = 8;  /** 實(shí)際展示的行數(shù) */  private static final int DEFAULT_SHOW_LINE_COUNT = 6;      private static final int COLLAPSIBLE_STATE_NONE = 0;  /** View處于展開狀態(tài) **/  private static final int COLLAPSIBLE_STATE_SHRINKUP = 1;  /** view收縮時(shí)狀態(tài) **/  private static final int COLLAPSIBLE_STATE_SPREAD = 2;  /** 顯示內(nèi)容的View */  private TextView tv_context;  /** 展開/收起按鈕 */  private TextView bt_spread;  private String shrinkup;  private String spread;  /** 當(dāng)前正處于的狀態(tài) */  // private int mState;  private boolean flag;  private int nowType;  private CollapsibleTextView coTextView;  /** 判斷是不是點(diǎn)擊了查看更多、收起 */  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;  // 對(duì)內(nèi)容中的網(wǎng)址進(jìn)行處理;  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;  // 第一次進(jìn)入操作(沒有點(diǎn)擊并且是第一次進(jìn)入);  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);  // 點(diǎn)擊了查看更多、收起轉(zhuǎn)換狀態(tài);  } 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);  }  // 滑動(dòng)listView 從新載入到可見界面 不做操作,保持原有狀態(tài);(為了后面看得人能夠更理解寫上)  } 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;    /**     * 內(nèi)容View     */    private View mContentView;    /**     * 可收縮的View     */    private View mCollapsibleView;    /**     * 可收縮的大小     */    private int mCollapsibleSize;    /**     * 收縮的監(jiān)聽器     */    private OnCollapsibleListener mCollapsibleListener;    /**     * 收縮動(dòng)畫的時(shí)間     */    private int mAnimDuration = 0;  //SUPPRESS CHECKSTYLE    /**     * 判斷當(dāng)前可收縮View是否是打開狀態(tài)     */    private boolean mIsOpened = false;    /**     * 可收縮View默認(rèn)是否可見     */    private boolean mCollapsibleViewDefaultVisible = false;    /**     * Toggle是否可用     */    private boolean mToggleEnable = true;    /**     * 不使用Alpha動(dòng)畫     */    private boolean mWithoutAlphaAnim = true;    /**     * 收縮是否有動(dòng)畫效果     */    private boolean mDoAnimation = true;    public interface OnCollapsibleListener {        /**         * 動(dòng)畫結(jié)束監(jiān)聽         *         * @param isOpened 當(dāng)前的stretchView是否是打開的,         */        void onCollapsibleFinished(boolean isOpened);        /**         * 動(dòng)畫過程中使用Transformation的接口         *         * @param from             from         * @param to               to         * @param interpolatedTime interpolatedTime         */        void applyTransformation(int from, int to, float interpolatedTime);    }    /**     * 構(gòu)造方法     *     * @param context context     */    public CollapsiblePanel(Context context) {        super(context);        init(context, null);    }    /**     * 構(gòu)造方法     *     * @param context context     * @param attrs   attrs     */    public CollapsiblePanel(Context context, AttributeSet attrs) {        super(context, attrs);        init(context, attrs);    }    /**     * 構(gòu)造方法     *     * @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);    }    /**     * 設(shè)置控件初始時(shí)是否可見     *     * @param visible 是否可見     */    public void setCollapsibleViewDefaultVisible(boolean visible) {        mCollapsibleViewDefaultVisible = visible;        // 默認(rèn)可見的話,則認(rèn)為是展開的        mIsOpened = visible;    }    /**     * 控件初始時(shí)是否可見     *     * @return visible     */    public boolean getCollapsibleViewDefaultVisible() {        return mCollapsibleViewDefaultVisible;    }    /**     * 設(shè)置toggle是否可用,如果設(shè)置為false,則{@link #toggle()}接口無效     *     * @param enable enable     */    public void setToggleEnable(boolean enable) {        mToggleEnable = enable;    }    /**     * 獲取當(dāng)前的主View     *     * @return view     */    public View getContentView() {        return mContentView;    }    /**     * 獲取當(dāng)前的擴(kuò)展View     *     * @return view     */    public View getStretchView() {        return mCollapsibleView;    }    /**     * 設(shè)置主View     *     * @param view view     */    public void setContentView(View view) {        if (view != null) {            if (mContentView != null) {                removeView(this.mContentView);            }            mContentView = view;            addView(mContentView, 0);        }    }    /**     * 設(shè)置收縮的View     *     * @param collapsibleView 可以收縮的View     */    public void setCollapsibleView(View collapsibleView) {        if (collapsibleView != null) {            if (mCollapsibleView != null) {                removeView(mCollapsibleView);                // 在重新設(shè)置時(shí),將該值置為0,否則新view將不能顯示正確的高度                mCollapsibleSize = 0;            }            mCollapsibleView = collapsibleView;            addView(mCollapsibleView);        }    }    /**     * 得到可收縮View的大小     *     * @return 可收縮View的大小     */    public int getCollapsibleSize() {        return mCollapsibleSize;    }    /**     * 設(shè)置收縮的監(jiān)聽     *     * @param listener listener     */    public void setOnCollapsibleListener(OnCollapsibleListener listener) {        mCollapsibleListener = listener;    }    /**     * 當(dāng)前的視圖是否已經(jīng)展開     *     * @return true/false     */    public boolean isCollapsibleViewOpened() {        return mIsOpened;    }    /**     * 設(shè)置展開(或者收縮)動(dòng)畫的時(shí)間,默認(rèn)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;        }        // 如果動(dòng)畫正在進(jìn)行,不執(zhí)行任何操作        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展開或收縮時(shí)調(diào)用     *     * @param isOpened isOpened     */    protected void onCollapsibleFinished(boolean isOpened) {    }    /**     * 重置大小     */    protected void resetCollapsibleSize() {        mCollapsibleSize = 0;        requestLayout();    }    /**     * 設(shè)置收縮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);        }    }    /**     * 判斷動(dòng)畫是否正在播放     *     * @return true/false     */    private boolean isAnimationPlaying() {        if (null != mCollapsibleView) {            Animation anim = mCollapsibleView.getAnimation();            if (null != anim && !anim.hasEnded()) {                return true;            }        }        return false;    }    /**     * 動(dòng)畫的監(jiān)聽器     */    private AnimationListener mCollapsibleAnimListener = new AnimationListener() {        @Override        public void onAnimationStart(Animation animation) {        }        @Override        public void onAnimationRepeat(Animation animation) {        }        @Override        public void onAnimationEnd(Animation animation) {            onCollapsibleEnd();        }    };    /**     * 收縮結(jié)束時(shí)調(diào)用     */    private void onCollapsibleEnd() {        mIsOpened = !mIsOpened;        if (mCollapsibleListener != null) {            mCollapsibleListener.onCollapsibleFinished(mIsOpened);        }        if (null != mCollapsibleView) {            mCollapsibleView.setAnimation(null);        }        onCollapsibleFinished(mIsOpened);    }    /**     * 伸縮動(dòng)畫     */    private class CollapsibleAnimation extends Animation {        /**         * 開始的大小         */        private int mFromSize;        /**         * 結(jié)束的大小         */        private int mToSize;        /**         * 開始的Alpha         */        private float mFromAlpha;        /**         * 結(jié)束的Alpha         */        private float mToAlpha;        /**         * 構(gòu)造方法         *         * @param fromSize  初始的大小         * @param toSize    結(jié)束的大小         * @param fromAlpha 初始的透明度         * @param toAlpha   結(jié)束的透明度         */        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);                }            }        }    }}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人激情久久 | 精品国产91久久久久久浪潮蜜月 | chinese中国真实乱对白 | 欧美亚州| 日韩电影av在线 | 99爱国产精品 | 看全色黄大色黄大片女图片 | 性爱在线免费视频 | 国产最新网站 | 成人午夜网址 | 国色天香综合网 | 久久久入口 | h视频在线观看免费 | 欧美日韩中文字幕在线 | 国产成人网 | 久久成人精品视频 | 视频国产一区二区 | 成人男女啪啪免费观看网站四虎 | 久草视频手机在线观看 | 99精品视频网站 | 国产成人av在线播放 | 99精品国产视频 | 久久网站热最新地址4 | 亚洲成人在线免费 | 男女污污视频网站 | 污视频在线免费播放 | 视频在线色 | 斗罗破苍穹在线观看免费完整观看 | 欧美a区| 欧美性生交大片 | 国产1区2区3区中文字幕 | 国产精品爱久久久久久久 | 成人免费国产 | fc2国产成人免费视频 | 污版视频在线观看 | 视频一区二区精品 | 久久影院国产精品 | 懂色av懂色aⅴ精彩av | 亚洲午夜免费 | 国产精品99久久久久久久 | 国产免费一区视频 |