自定义listview右侧的字母导航view,滑动view时,listview显示的分组为自定义view的滑动到的字母
2016-07-23 17:23
561 查看
package com.contant.myview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
public class MyLetterTextView extends View{
public static String[] letters = {"#",
"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"};
Paint paint;
OnTouchLetterListener listener;
public MyLetterTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public void setOnTouchLetterListener(OnTouchLetterListener listener){
this.listener = listener;
}
private void initPaint() {
paint = new Paint();
paint.setColor(Color.RED);
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics());
paint.setTextSize(px);//12sp--->px
//paint.setTypeface(Typeface.DEFAULT_BOLD);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//控件的宽度
int width = getWidth();
//控件的高度/27
int height = getHeight()/27;
for(int i=0;i<letters.length;i++){
Rect bounds = new Rect();
paint.getTextBounds(letters[i], 0, letters[i].length(), bounds );
int letterWidth = bounds.width();
int letterHeight = bounds.height();
float x = width/2-letterWidth/2;//控件的宽度/2 - 文字的宽度/2
float y = height/2+letterHeight/2 + height*i;//控件的高度/27/2+文字的高度/2
canvas.drawText(letters[i], x, y, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
setBackgroundColor(Color.LTGRAY);
float y = event.getY();
int idx = (int) ((y*letters.length)/getHeight());
if(idx >=0 && idx<letters.length){
//调用OnTouchLetterListener的onTouchLetter方法
if(listener!=null){
listener.onTouchLetter(letters[idx]);
}
}
break;
default:
setBackgroundColor(Color.TRANSPARENT);
if(listener!=null){
listener.onReleaseLetter();
}
break;
}
return true;
}
public interface OnTouchLetterListener{
void onTouchLetter(String letter);
void onReleaseLetter();
}
}
java代码实现部分
private void initMyLetterTextView() {
letterView.setOnTouchLetterListener(new OnTouchLetterListener() {
@Override
public void onTouchLetter(String letter) {
if (adapter.getPositionForSection(letter.charAt(0))!=-1) {
listView.setSelection(adapter.getPositionForSection(
letter.charAt(0))+1);
}
if (!tv_letter_display.isShown()) {
tv_letter_display.setVisibility(View.VISIBLE);
}
tv_letter_display.setText(letter);
}
@Override
public void onReleaseLetter() {
tv_letter_display.setVisibility(View.INVISIBLE);
}
});
}
onTouchLetter和onReleaseLetter的代码都是自己的业务逻辑,其中adapter的数据集合是有序排列的集合
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
public class MyLetterTextView extends View{
public static String[] letters = {"#",
"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"};
Paint paint;
OnTouchLetterListener listener;
public MyLetterTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public void setOnTouchLetterListener(OnTouchLetterListener listener){
this.listener = listener;
}
private void initPaint() {
paint = new Paint();
paint.setColor(Color.RED);
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics());
paint.setTextSize(px);//12sp--->px
//paint.setTypeface(Typeface.DEFAULT_BOLD);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//控件的宽度
int width = getWidth();
//控件的高度/27
int height = getHeight()/27;
for(int i=0;i<letters.length;i++){
Rect bounds = new Rect();
paint.getTextBounds(letters[i], 0, letters[i].length(), bounds );
int letterWidth = bounds.width();
int letterHeight = bounds.height();
float x = width/2-letterWidth/2;//控件的宽度/2 - 文字的宽度/2
float y = height/2+letterHeight/2 + height*i;//控件的高度/27/2+文字的高度/2
canvas.drawText(letters[i], x, y, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
setBackgroundColor(Color.LTGRAY);
float y = event.getY();
int idx = (int) ((y*letters.length)/getHeight());
if(idx >=0 && idx<letters.length){
//调用OnTouchLetterListener的onTouchLetter方法
if(listener!=null){
listener.onTouchLetter(letters[idx]);
}
}
break;
default:
setBackgroundColor(Color.TRANSPARENT);
if(listener!=null){
listener.onReleaseLetter();
}
break;
}
return true;
}
public interface OnTouchLetterListener{
void onTouchLetter(String letter);
void onReleaseLetter();
}
}
java代码实现部分
private void initMyLetterTextView() {
letterView.setOnTouchLetterListener(new OnTouchLetterListener() {
@Override
public void onTouchLetter(String letter) {
if (adapter.getPositionForSection(letter.charAt(0))!=-1) {
listView.setSelection(adapter.getPositionForSection(
letter.charAt(0))+1);
}
if (!tv_letter_display.isShown()) {
tv_letter_display.setVisibility(View.VISIBLE);
}
tv_letter_display.setText(letter);
}
@Override
public void onReleaseLetter() {
tv_letter_display.setVisibility(View.INVISIBLE);
}
});
}
onTouchLetter和onReleaseLetter的代码都是自己的业务逻辑,其中adapter的数据集合是有序排列的集合
相关文章推荐
- Android实现自定义字体格式液晶数字
- [Spring]Spring容器扩展点
- 341. Flatten Nested List Iterator
- Codeforces 700B Connecting Universities(DFS)
- Android 屏幕适配之各种概念(一)
- C#版mysql连接字符串
- mysql 5.7 docker 主从复制架构搭建
- Crowbar 电路
- socket同步异步阻塞非阻塞区别
- Java进阶(三十七)java 自动装箱与拆箱
- 排序算法总结
- POJ 1988 Cube Stacking
- Java 抽象类 接口 继承 实现
- Android常用开发工具类
- 针对PagerSlidingTabStrip 1.3的功能改善(滑动条长度根据标题长度动态变化)
- template model
- Java进阶(三十七)java 自动装箱与拆箱
- iOS应用文件夹
- 字节序不是由操作系统决定的,而是由cpu架构决定的
- java中序列化之子类继承父类序列化