要想做一个跟通讯录类似的在右侧实现滑动,
看看界面
下面看一下实现的代码:
friend.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background" android:orientation="vertical" > <include layout="@layout/friend_header"/> <RelativeLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/list_view" android:layout_height="wrap_content" android:layout_width="fill_parent" android:scrollbars="none" android:cacheColorHint="@color/white" ></ListView> <com.example.widget.MyLetterListView android:id="@+id/my_list_view" android:background="@drawable/corner" android:layout_width="30dip" android:layout_height="fill_parent" android:layout_alignParentRight="true" /> </RelativeLayout> </LinearLayout>
friend_header.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="2dip" android:paddingRight="2dip" android:gravity="center_vertical" android:orientation="horizontal" android:background="@drawable/widget_bar_bg"> <TextView android:id="@+id/friend_search_head_title" style="@style/detail_head_title" android:layout_gravity="center" android:clickable="true" android:textSize="20sp" android:text="@string/my_friend" ></TextView> <ImageView android:id="@+id/friend_center_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center" android:clickable="true" android:textColor="@color/white" android:background="@drawable/add_friend" ></ImageView> </FrameLayout>
这里主要把组件构建出来,滑动功能还没有实现
MyLetterListView.java
package com.example.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class MyLetterListView extends View { OnTouchingLetterChangedListener onTouchingLetterChangedListener; String[] b = {"@","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","#"}; int choose = -1; Paint paint = new Paint(); boolean showBkg = false; public MyLetterListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyLetterListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyLetterListView(Context context) { super(context); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(showBkg){ canvas.drawColor(Color.parseColor("#40000000")); } int height = getHeight(); int width = getWidth(); int singleHeight = height / b.length; for(int i=0;i<b.length;i++){ paint.setColor(Color.BLACK); paint.setTypeface(Typeface.DEFAULT_BOLD); paint.setAntiAlias(true); if(i == choose){ paint.setColor(Color.parseColor("#3399ff")); paint.setFakeBoldText(true); } float xPos = width/2 - paint.measureText(b[i])/2; float yPos = singleHeight * i + singleHeight; canvas.drawText(b[i], xPos, yPos, paint); paint.reset(); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); final float y = event.getY(); final float x = event.getX(); final int oldChoose = choose; final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; final int c = (int) (y/getHeight()*b.length); switch (action) { case MotionEvent.ACTION_DOWN: showBkg = true; if(oldChoose != c && listener != null){ if(c > 0 && c< b.length){ listener.onTouchingLetterChanged(b[c],y,x); choose = c; invalidate(); } } break; case MotionEvent.ACTION_MOVE: if(oldChoose != c && listener != null){ if(c > 0 && c< b.length){ listener.onTouchingLetterChanged(b[c],y,x); choose = c; invalidate(); } } break; case MotionEvent.ACTION_UP: showBkg = false; choose = -1; listener.onTouchingLetterEnd(); invalidate(); break; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) { this.onTouchingLetterChangedListener = onTouchingLetterChangedListener; } public interface OnTouchingLetterChangedListener{ public void onTouchingLetterEnd(); public void onTouchingLetterChanged(String s,float y,float x); } }