Android UI(五)云通讯录项目之联系人列表,带侧滑选择,带搜索框

简介:

一、前言

    继续AndroidUI系列,泥瓦匠又要开始扯淡了。哈哈今天在文章头加了个支付宝账号。我也真逗,至今没收到一笔是写博客的钱。或是分享的。泥瓦匠也就挂着逗逗乐而已。笑着就笑吧,我也在笑了。

    和我的师傅扯着蛋。也教授了泥瓦匠很多东西。泥瓦匠一直在学习,一直在进步而已。这是师傅送我的话:

睡少点,玩少点,分清主次拍优先级。还要发挥同伴的能力,不是什么事情都要自己做的。

二、正文

    今天要讲的内容很多。还是主要大家去看代码吧。我把主要的东西,介绍下。然后给源码自己参透吧。下面给大家带来的是这一讲,云通讯录之联系人列表,带侧滑选择,带搜索框。

7MA6B{~~@L(1VSV)3RCJ6$K(3%N}[Z4[)9@{O2MMOT64VO[S8]2(EET{GE2)%MZJ{I3MI

    泥瓦匠的思路

  • 一个barTop层:两个ImgView或是Button,一个TextView,用styles.xml控制其的样式。
  • 核心中间listView 和 侧滑View 搜索框View 自定义实现。这将是本讲的重点 
  • 底部TextView的实现      

三、实现核心代码

    泥瓦匠刚刚吃完午饭,来扯会淡。路上遇到一对黑人唱着歌,朝着食堂吃饭去了。生活就需要这样子,其乐融融。

    下面泥瓦匠先实现旁边的侧滑(SideBar),其实也就是和上一篇的Android UI(四)云通讯录项目之云端更新进度条实现中的自定义View一样的。只要知道一些Canvas、Paint的一些基础就好了。我们很简单的定义了一个26个字母的String数组,然后循环将他们Paint出来就好了。其实就是这么简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package org.nsg.views;
 
 
import com.example.android05.R;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
 
public class SideBar extends View
{
     // touching event
     private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
     // 26 letters
     public static 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", "#"
         };
     // if choosed
     private int choose  = -1;
     private Paint paint = new Paint();
     
     private TextView mTextDialog;
     
     public void setmTextDialog(TextView mTextDialog)
     {
         this.mTextDialog = mTextDialog;
     }
 
     public SideBar(Context context, AttributeSet attrs, int defStyleAttr)
     {
         super(context, attrs, defStyleAttr);
     }
 
     public SideBar(Context context, AttributeSet attrs)
     {
         super(context, attrs);
     }
 
     public SideBar(Context context)
     {
         super(context);
     }
 
     // override onDraw function
     protected void onDraw(Canvas canvas)
     {
         super.onDraw(canvas);
         // get the height
         int height = getHeight();
         // get the width
         int width = getWidth();
         // get one letter height
         int singleHeight = height / b.length;
         
         for (int i = 0; i < b.length ; i++)
         {
             paint.setColor(Color.rgb(33, 65, 98));
             paint.setTypeface(Typeface.DEFAULT_BOLD);
             paint.setAntiAlias(true);
             paint.setTextSize(20);
             
             // if choosed
             if(i == choose)
             {
                 paint.setColor(Color.parseColor("#3399ff"));
                 paint.setFakeBoldText(true);
             }
             
             // draw text
             float x = width / 2 - paint.measureText(b[i]) / 2;
             float y = singleHeight * i + singleHeight;
             canvas.drawText(b[i], x, y, paint);
             paint.reset();
         }
         
         
     }
     
     
 
     @SuppressWarnings("deprecation")
     @Override
     public boolean dispatchTouchEvent(MotionEvent event)
     {
         final int action = event.getAction();
         final float y = event.getY(); // get the Y
         final int oldChoose = choose;
         final OnTouchingLetterChangedListener changedListener = onTouchingLetterChangedListener;
         final int letterPos = (int)( y / getHeight() * b.length);
         
         switch (action)
         {
             case MotionEvent.ACTION_UP:
                 setBackgroundDrawable(new ColorDrawable(0x00000000));
                 choose = -1;
                 invalidate();
                 if (mTextDialog != null)
                     mTextDialog.setVisibility(View.INVISIBLE);
                 break;
                 
             default:
                 setBackgroundResource(R.drawable.bg_sidebar);
                 if (oldChoose != letterPos)
                 {
                     if (letterPos >= 0 && letterPos < b.length)
                     {
                         if (changedListener != null)
                             changedListener.onTouchingLetterChanged(b[letterPos]);
                         if (mTextDialog != null)
                         {
                             mTextDialog.setText(b[letterPos]);
                             mTextDialog.setVisibility(View.VISIBLE);
                         }
                         
                         choose = letterPos;
                         invalidate();
                     }
                 }
                 break;
         }
         return true;
     }
 
     public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener changedListener)
     {
         this.onTouchingLetterChangedListener = changedListener;
     }
     
     public interface OnTouchingLetterChangedListener
     {
         public void onTouchingLetterChanged(String str);
     }
}

  既然做好了这个,我们就实现这个listView,其实ListView是最好实现的。先定义一个ListView,然后再创一个相应的item的xml。用代码将它们循环一下就好。

  下面是item的xml代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<? xml version="1.0" encoding="utf-8"?>
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="match_parent"
     android:gravity="center_vertical"
     android:orientation="vertical" >
     
     < TextView
         android:id="@+id/txt_catalog"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:paddingBottom="5dp"
         android:paddingTop="5dp"
         android:paddingLeft="12dp"
         android:text="A"
         android:textColor="@color/bluejeff"
         android:drawableBottom="@drawable/line_blue" />
     
     < RelativeLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">
         
         < ImageView
            android:id="@+id/user_head"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="12dp"
            android:layout_marginTop="6dp"
            android:layout_marginBottom="6dp"
            android:background="@drawable/bg_border"
            android:src="@drawable/user_head" />
         
         < LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_toRightOf="@id/user_head"
             android:background="@color/white"
             android:orientation="vertical">
              < TextView
                 android:id="@+id/txt_user_name"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:textColor="@color/black"
                 android:layout_marginTop="12dp"
                 android:layout_marginLeft="10dp"
                 android:layout_marginBottom="6dp"
                 android:textSize="20sp"
                 android:text="Jeff Lee"/>
 
              < TextView
                  android:id="@+id/txt_user_list_info"
                  android:layout_width="wrap_content"
                  android:layout_height="30dp"
                  android:textSize="12sp"
                  android:layout_marginLeft="10dp"
                  android:text="IT部门    信息科"
                  android:textColor="@color/gray" />
 
          </ LinearLayout >
         < TextView
             android:id="@+id/txt_user_id"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="#336598"
             android:visibility="gone"
             android:text="1"/>
     </ RelativeLayout >
       
</ LinearLayout >

  然后我们实现那个搜索框,搜索框其实看上去就是个TextView。所以我们继承TextView的类,并实现焦点控制的监听器等,让这些更好的给我们用。难点也没有,就是那个画出搜索图标而已。代码我下面也给出来了:

  最后,大功告成。小结下,其实这个界面还有增加了一个SidleBar。在我们Android UI(三)SlidingMenu实现滑动菜单(详细 官方)这里讲过的。因为user有个组,或是在其中一本电话本里面的。然后一个界面大家别觉得它太麻烦。一个一个来,有成就感。老话说一句呗:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。

  任何做事都一样,注意细节。一步一步来,Think big, Start small, Scale fast.道理都知道,就去做呗。

四、总结

   本章关于云通讯录的界面我会慢慢分享给大家。项目也放在下面的链接供大家下载学习。这个比较难,大家好好看代码吧。关于代码在下面的链接:http://files.cnblogs.com/Alandre/Android05.rar

相关文章
|
1天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
3月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
133 1
|
3月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
160 2
|
3月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
277 0
安卓项目:app注册/登录界面设计
|
5天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
22天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
2月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
70 6
|
3月前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
63 2
|
4月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
3月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目