国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android仿微信通訊錄滑動快速定位功能

2019-12-12 03:22:26
字體:
來源:轉載
供稿:網友

先給大家展示下效果圖:

實現代碼如下:

下面簡單說下實現原理。

public class IndexBar extends LinearLayout implements View.OnTouchListener {  private static final String[] INDEXES = new String[]{"#", "A", "B", "C", "D", "E", "F", "G", "H",      "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};  private static final int TOUCHED_BACKGROUND_COLOR = 0x40000000;  private OnIndexChangedListener mListener;  public void setOnIndexChangedListener(OnIndexChangedListener listener) {    mListener = listener;  }  public IndexBar(Context context) {    this(context, null);  }  public IndexBar(Context context, AttributeSet attrs) {    this(context, attrs, 0);  }  public IndexBar(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    init(attrs);  }  private void init(AttributeSet attrs) {    TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.IndexBar);    float indexTextSize = ta.getDimension(R.styleable.IndexBar_indexTextSize, Utils.sp2px(getContext(), 12));    int indexTextColor = ta.getColor(R.styleable.IndexBar_indexTextColor, 0xFF616161);    ta.recycle();    setOrientation(VERTICAL);    setOnTouchListener(this);    for (String index : INDEXES) {      TextView text = new TextView(getContext());      text.setText(index);      text.setTextSize(TypedValue.COMPLEX_UNIT_PX, indexTextSize);      text.setTextColor(indexTextColor);      text.setGravity(Gravity.CENTER);      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1);      text.setLayoutParams(params);      addView(text);    }  }  @Override  public boolean onTouch(View v, MotionEvent event) {    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        setBackgroundColor(TOUCHED_BACKGROUND_COLOR);        handle(v, event);        return true;      case MotionEvent.ACTION_MOVE:        handle(v, event);        return true;      case MotionEvent.ACTION_UP:        setBackgroundColor(Color.TRANSPARENT);        handle(v, event);        return true;    }    return super.onTouchEvent(event);  }  private void handle(View v, MotionEvent event) {    int y = (int) event.getY();    int height = v.getHeight();    int position = INDEXES.length * y / height;    if (position < 0) {      position = 0;    } else if (position >= INDEXES.length) {      position = INDEXES.length - 1;    }    String index = INDEXES[position];    boolean showIndicator = event.getAction() != MotionEvent.ACTION_UP;    if (mListener != null) {      mListener.onIndexChanged(index, showIndicator);    }  }  public interface OnIndexChangedListener {    void onIndexChanged(String index, boolean showIndicator);  }}

使用

public class CompanyActivity extends BaseActivity implements IndexBar.OnIndexChangedListener {  @Bind(R.id.lv_company)  ListView lvCompany;  @Bind(R.id.ib_indicator)  IndexBar ibIndicator;  @Bind(R.id.tv_indicator)  TextView tvIndicator;  private List<CompanyEntity> mCompanyList = new ArrayList<>();  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_company);    // ...  }  @Override  public void onIndexChanged(String index, boolean showIndicator) {    int position = -1;    for (CompanyEntity company : mCompanyList) {      if (TextUtils.equals(company.getName(), index)) {        position = mCompanyList.indexOf(company);        break;      }    }    if (position != -1) {      lvCompany.setSelection(position);    }    tvIndicator.setText(index);    tvIndicator.setVisibility(showIndicator ? View.VISIBLE : View.GONE);  }}

繼承自LinearLayout,添加了26個字母索引TextView,當手指滑動時通知Activity更新界面。

核心是OnTouchListener,手指滑動的時候根據當前Y坐標計算出手指所在的索引位置,要注意臨界值。

以上所述是小編給大家介紹的Android仿微信通訊錄滑動快速定位功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 抚州市| 东丰县| 屯昌县| 怀安县| 蓬溪县| 六安市| 卢龙县| 曲麻莱县| 隆德县| 琼海市| 佛坪县| 宁阳县| 沾益县| 西宁市| 高雄市| 库尔勒市| 鲁甸县| 盐边县| 柘城县| 来安县| 香河县| 剑河县| 绥阳县| 凤台县| 镇巴县| 红安县| 怀来县| 敦化市| 墨江| 法库县| 白玉县| 化州市| 云南省| 仁怀市| 丰顺县| 津南区| 双鸭山市| 长泰县| 葫芦岛市| 台东县| 高邮市|