前言
暑假我在学校学习了一个月的时间 ,在这一个月期间我学习了关于安卓移动前端开发的一些简单的知识。之前我对安卓移动开发可谓是一窍不通,老师让我花前两周的时间来看了一本关于移动开发的书———《第一行代码》。就我个人而言感觉这本书非常的好,非常适合一个像我这样的菜鸟学习Java的移动开发,在这本书从下载开发工具到写完一个APP的发布都是非常的详细。但这本书里教的东西还是比较有局限的,仅适合初学者,很多都是需要自己去百度或者寻找各种书来解答。总而言之,在学校这一个月的时间我学到了很多,因为一个月的时间都是专心的学习一样东西,这个夏令营过得很有意义,以下是我这个月的学习成果。
常用控件的使用方法(参考书籍'第一行代码')
- TextView
修改布局如下:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:textColor="#00ff00"
android:text="jian shu"/>
</LinearLayout>
- 在布局中添加TextView控件,它主要用于在界面上显示一段文本信息。
- android:id 是给当前的元素定义一个唯一的标识符,之后可以在代码中对这个元素进行操作。
- android:layout_width和android:layout_height指定了控件的宽度和高度,可选值有三种:match_parent、wrap_content和fill_parent,其中match_parent和fill_parent的意义相同,现在官方更加推荐使用 match_parent,match_parent 表示让当前的控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小,wrap_content 表示让当前控件的大小能包含住里面的内容,也就是由控件的内容决定控件的大小。
- android:gravity是用来指定文件的对齐方式,可选值有: top 、botton、left、right、center 等,可以用“ | ”来同时指定多个值,这里我们指定center , 表示文字在垂直和水平方向上都居中对齐,如果控件中不添加这个属性,那么布局就默认TextView中的文字居左上角对齐。
- android:textSize 和 android:textColor 表示更改TextView中文字的大小和颜色,Android的字体大小使用sp作为单位。
- android:text 表示TextView 中显示的内容。
运行程序,效果如下:
- Button
在布局中添加一个Button,如下:
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button"
android:textAllCaps="false"/>
- 其他属性在上面都已经介绍过了, android:textAllCaps 比较陌生,他的作用是对Button中的所有英文字母进行大小写转换的控制,如果不添加此书行,系统默认为进行大写转换。“false” 为禁用大写转换,
- 可以在MainActivity中添加一个监听器,代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "简书", Toast.LENGTH_SHORT).show();
}
});
}
}
点击Button按钮,效果如下图:
- EditText
同样在布局中添加这个控件,代码如下:
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Welcome"
android:maxLines="3"/>
- EditText 允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。
- android:hint 属性指定了一段提示文本。
-
android:maxLines 指定了 EditText的最大行数,这里我们选最大3行,这样当输入的内容超过3行时,文本就会向上滚动,而 EditText 则不会向上拉伸。效果如下图:
4.ImageView
同样在布局中添加此控件:
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/image1"/>
- ImageView 是一个展示图片的控件。
- android:src为添加照片的属性,准备两张照片放在 drawable文件下。
我们可以动态的更改 ImageView 中的图片,通过修改MainActivity:
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
imageView = (ImageView) findViewById(R.id.image_view);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
imageView.setImageResource(R.drawable.image2);
}
});
}
}
运行程序,点击Button 后发现图片切换了,如下图:
修改布局和MainActivity :
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
imageView = (ImageView) findViewById(R.id.image_view);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if (progressBar.getVisibility() == View.GONE) {
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
}
}
});
}
}
效果如下图,可以通过点击Button按钮来控制进度条的显示。
碎片与活动之间进行通信
- 碎片是一种可以嵌入在活动当中的UI片段,他能让程序更加合理和充分的利用大屏幕的空间。虽然碎片都是嵌入在活动中显示的,可是实际上它们的关系并没有那么密切。碎片和活动都是各自存在于一个独立的类当中的,它们之间并没有那么明显的方式来直接进行通信。
- 为了方便碎片与活动之间进行通信,FramentManager提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例。
这是在活动中调取碎片:调用FragmentManagerf中的indFragmentById()方法
RightFragment rightFragment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment);
这是在碎片中调用活动:
MainActivity acivity = (MainActivity) getActivity();
提升ListView的运行效率
public View getView(int position, View converView, ViewGroup parent){
Fruit fruit = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
ImageView fruitImage = (ImageView) view.findViewById(R.id.furit_image);
TextView fruitName = (TextView) view.findViewById(R.id.furit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
1 . 以上的ListView的运行效率很低,因为在FruitAdapter的getView()方法中,每次都将布局重新加载一遍,当ListView快速滚动的时候,这就会成为性能的饿瓶颈。
public View getView(int position, View converView, ViewGroup parent){
Fruit fruit = getItem(position);
View view;
if (converView ==null){
view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
} else {
view = converView;
}
ImageView fruitImage = (ImageView) view.findViewById(R.id.furit_image);
TextView fruitName = (TextView) view.findViewById(R.id.furit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
2 . 如果改为上述,现在我们可以在getView()方法中进行判断,如果cnvertView为null,则使用LayoutInfater去加载布局,如果不为null则直接对converView进行崇从用。这样就大大提高了ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。
GridView和Spinner的介绍
在最近的学习中,我接触了GridView、Spinner。下面我来对他们的简单介绍:
- GridView 是 DataGrid的后继控件,在.net framework 2 中,虽然还存在DataGrid,但是GridView已经走上了历史的前台,取代DataGrid的趋势已是势不可挡。GridView和DataGrid功能相似,都是在web页面中显示数据源中的数据,将数据源中的一行数据,也就是一条记录,显示为在web页面上输出表格中的一行。在https://baike.baidu.com/item/gridview/6027180?fr=aladdin 中有对GridView的简单介绍。
- 要想实现GridView的显示,主要有三个步骤:1是准备数据源,2是新建适配器,3是加载适配器。
- 但想要比较熟悉的了解和运用Gridview的话,单单有介绍还是不行的,还要有一些实例作参考。下面几个链接的实例都是比较简单的,对于像我这种初学者来说还是比较容易看懂的。
http://www.cnblogs.com/zzw1994/p/5082591.html
http://blog.csdn.net/leichelle/article/details/7951290
- 这里的实例分了三种情况,第一个是只显示图片的,第二个是显示图片文字的(这里的图片是Android系统自带的图片),第三个是显示自定义的图片文字。
-
Spinner是一个提供了下拉列表样式的布局空控件,如下图所示:
我本次主要学习这个控件来对所选的学期进行一个下拉选择,代码如下:
修改mainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner) this.findViewById(R.id.spinner1);
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, new String[] { " ","16-17-2", "16-17-1",
"15_16-2","15_16-1","14_15-2","14_15-1","13_14-2"
,"13_14-1","12_13-2","12_13-1","11_12-2","11_12-1","10_11-2","10_11-1","09_10-2","09_10-1","08_09-2","08_09-1","07_08-2"
,"07_08-1","06_07-2","06_07-1","05_06-2","05_06-1","04_05-2","04_05-1","03_04-2","03_04-1","02_03-2","02_03-1","01_02-2"
,"01_02-1" });
//设置下拉样式
adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
spinner.setAdapter(adapter);
}
修改activity_main
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/spinner1"
android:layout_marginTop="40sp"/>
效果如下图
- 上面我做的只是一个简单的下拉列表。 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0105/2264.html这里面的Spinner实例比较多也比较好。
- 在布局过程中 ,可能会为不知道各种颜色相应的代码而苦恼,所以下面这个链接会为你提供所需的颜色代码。
http://www.114la.com/other/rgb.htm
如下图
56项App 介绍及其源码下载地址
在学习安卓的移动开发的时候,多看看一些开源的代码非常的有助于自己的提高,所以我在前人的总结下自己又总结了一遍可以学习借鉴的54个APP的开源代码。
1. WeChat 高仿微信
高仿微信,实现功能有: 好友之间文字聊天,表情,视频通话,语音, 语音电话,发 送文件等。
项目介绍及其源码下载地址:
http://www.jcodecraeer.com/a/opensource/2015/0619/3087.html
2. 知乎专栏App
第三方的 app,引用作者的描述:“最近一直在利用空余时间开发一个完 整的 App,名字就叫“专栏”。开发这个 App 的目的主要是为了练练手,熟悉
开发一个完整 App 的流 程。就像造房子,亲手打地基,搬砖头, 垒砖头,还自己装修(虽然装修的不好看)”项目介绍及其源码下载地
址:http://www.jcodecraeer.com/a/opensource/2015/0328/2657.html
3. GankMeiZhi
一个妹子图项目。通过这个项目,你可能可以学习到的内容有: 多渠 道打包 使用
ORM 快速操作数据库 访问网络,简单解析 HTML RecyclerView 瀑布流的使用 RecyclerView 底部加载更多的简单实现 Material Design 的下拉刷
新
使用最新的 Design 兼容库 使用 5.0 的 Share 组件或元素动画 使用 Toolbar 完全替代 ActionBar。
使用说明:
本项目包含以下知识点:
- Butter Knife:通过注解绑定 View
- Realm在:数据库
- RecyclerView 及 StaggeredGridLayoutManager 瀑布流布局
- IntentService 实现的后台网络请求
- Android Design Support Library 中的 CoordinatorLayout
- 使用 Jsoup 解析 HTML
使用要求
- Android 4.4 以上
开发要求
- Gradle 2.4 (或使用内置的 ./gradlew)
- Android Studio 1.3 RC1 以上 (canary channel)
- Android 5.1.X (API 22) SDK Platform
- Android Build-tools 23.0.0 rc3
- Android Support Repository
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0712/3176.html
4. 高仿jiandan
高仿煎蛋的 app,数据是采用抓包分析出煎蛋的 api,离线缓存使用GreenDao 实现本地 Sqlite 缓存。 ps : 煎蛋是一个 2b 青年聚集地。
项目介绍及其源码下载地址:http://www.codesocang.com/gn/xiangmu/33662.html
5. Wegit
一个第三方的Github客户端,采用mvp架构。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0818/3325.html
6. SimplifyReader
一款基于Google Material Design设计开发的Android客户端,包括新闻简读,图片浏览,视频爽看 ,音乐轻听以及二维码扫描五个子模块。项目采取的是MVP架构开发,由于还是摸索阶段,可能不是很规范。但基本上应该是这么个套路。
使用说明:
模块分析
新闻简读
介绍:API使用的是凤凰新闻客户端的接口,我只是简单的获取了新闻的列表和详情数据,由于api和凤凰新闻客户端完全一致,鉴于侵权问题我就不开源出来了。至于接口是如何获取的?Google,百度,调试获取日志,我能说的只有这么多。
功能:列表页使用自定义的ListView(自动加载更多)显示新闻列表,详情使用的是WebView加载,支持滑动返回。对于多图 新闻的处理,使用的和主流新闻客户端类似,滑动切换多张图片,可双指缩放图片大小!图片浏览
介绍:API使用的是百度图片的搜索接口,由于网上有很多的开发者开源了这个接口,所以我也就放出来,如有侵权请及时告知。
功能:列表页使用的瀑布流效果(增加了下拉刷新和上拉加载更多)详情页和列表页的切换增加了一个图片放大或缩小到指定位置的效果,图片也可以双指缩放!视频爽看
介绍:API使用的是优酷开放平台的SDK,不过要吐槽的一点是,优酷的SDK真心不好用,还是Eclipse版本的,我是一点点移植到Android Studio平台的,但是它的接口还是很丰富的,好好的利用一下,还是能够做出一个优秀的APP的。
功能:列表页使用了Google的CardView,简单的获取了一些视频的基本数据。播放页使用了优酷提供的视频播放器组件,传入视频ID就可以播放视频了,只要调通了SDK,其他的都是一些简单的数据获取!音乐轻听
介绍:API获取的是豆瓣音乐的数据,由于也不是开放API,如有侵权请及时告知。
功能:播放音乐的界面是我自定义的一个唱机的View,很多思路都是从网上学习借鉴过来的,自己重新造了个轮子。UI和网易云音乐对比的话,只能说是形似神不似了,没有人家做的细致!二维码扫描
介绍:这个完全是我自己单独开发的类库,之前也有开源出来,这次又再一次重构优化,后期会单独剥离二维码扫描模块,做成类库和Demo的形式,提供Android Studio版本。
功能:扫描界面使用xml进行布局,然后加入属性动画。这样布局更具有优势,更利于多屏幕适配。解码模块使用的是两个主流的开源库Zbar和ZXing,进过多次测试发现,ZBar虽然扫描效率和速度高于ZXing,但是经常扫描出错误的信息,可能由于太灵敏的缘故把,综合二者的优缺点还是建议使用ZXing来解码,并且这个项目还在长期维护更新!
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2015/0818/3324.html
7. StickerCamera
这是一款集成了相机,图片裁剪,给图片贴贴图打标签的APP。编译需要java8。
使用说明:
实现相机功能
实现对图片进行裁剪的功能
图片的滤镜功能
能为图片添加贴纸(贴纸可移动,放大,旋转)
能为图片添加标签(同样可以移动)
本地保存制作好的图片,并展示
较多的自定义控件,不错的项目架构
项目介绍及其源码下载地址:
http://www.jcodecraeer.com/a/opensource/2015/0729/3232.html
8. SmsCodeHelper
是由原「贝壳单词」团队开发的一款新的开源轻App. 它可以在手机接收到验证码短信的时候,自动浮现验证码,并自动复制验证码到用户的剪切板。当用户接收到短信验证码,只要长按验证码的输入框,粘贴验证码即可。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0624/3102.html
9. Notes
一款基于Material Design 的开源笔记本应用,Material Design风格,采用抽屉式菜单,悬浮滑动按钮,点击控件时的水波纹效果,状态栏透明使得与应用融为一体,用户即使在Android L系统以下的手机也能感受到良好的用户体验 用文字记录身边随时发生的事情,或者你的待办事项 同步,同步需要你在手机设置里面添加一个邮箱,并作为你的同步账号,提交到服务器。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0613/3037.html
10. Hubble Gallery
一个显示哈勃拍摄的太空照片的相册类 app,该项目使用了ObservableScrollView,road-trip 等著名的库,很适合学习。
项目介绍及其源码下载地址:http://www.codeforge.cn/article/259687
11. BiliClient
仿bilibili客户端,喜欢动漫的进。
项目介绍及其源码下载地址::http://www.jcodecraeer.com/a/opensource/2015/0527/2936.html
12. V2EX社区客户端
支持功能:
话题查看
节点查看和按字母搜索
用户资料查看
话题回复
话题创建
未读提醒查看
其他功能:
实现了节点、话题、用户三个Scheme,通过话题、节点、用户链接直接打开客户端进行相关信息浏览
对用户已经浏览过的话题作记忆处理并在界面上进行展示
话题、帖子等采用了卡片式布局
编译需求:
JDK 1.7+
Android Studio 1.0+
Android SDK r21+
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0523/2917.html
13. Remindly
是一个简单的用户友好的提醒应用。特点:Material 风格,可以设置重复提醒,按小时,按天 按周,按月。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0504/2832.html
14. Launcher3
很老的项目了,更改官方的Launcher3使得可以在eclipse编译 targetSdkVersion 必须是19 (之前说的有错误) 如果修改AndroidManifest.xml后有错误,project -> clean 作者配有相关的分析文章 。
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2015/0412/2710.html
15. superCleanMaster
一键清理开源版,包括内存加速,缓存清理,自启管理,软件管理等。
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2015/0315/2604.html
16. BlackLight
是由纸飞机开发团队开发的一款Android上的新浪微博第三方轻量级客户端。没有任何商业化的因素,没有广告(新浪友情插入的除外),是一个最纯净的新浪微博客户端。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0309/2572.html
17. Sky31Radio
一个开源的校园电台app,一款学院风的电台节目。可以学习,不过因为是校园的东西,服务端说不定哪天说没就没了。
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2015/0303/2525.html
18. Material-Movies
material design风格的电影应用,这个应用的目的其实是为了讲解作者一篇文章中所描述的一种编程模式。
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2015/0209/2447.html
19. WayHoo
威震天气
本应用是以变形金刚作为主题元素的实用型Android天气软件,界面高仿雅虎天气,数据来自中国天气网!
下载apk
腾讯应用市场
百度应用市场
威震天气 Android 客户端项目简析
注:本文假设你已经有Android开发环境
①.启动Eclipse,将名为WayHoo导入作为主工程,并确保你当前的Android SDK是最新版。②.将libs目录下相应的库导入Eclipse,并作为主工程的库工程,以免缺少一些必要的资源或类。③.如果编译出错,请修改项目根目录下的 project.properties 文件。④.请使用Android 4.0 以上版本的SDK,JDK1.6编译:
target=android-19
项目介绍及其源码下载地址: http://git.oschina.net/way/WayHoo
20. OpenLibra-Material
OpenLibra 的一个客户端(非官方),演示了 Material 设计在真实应用
中的使用,OpenLibra 是西班牙的一个提供免费书籍下载的网站。建议 用 studio 编译
项目介绍及其源码下载地址:
http://www.apkbus.com/forum.php?mod=viewthread&tid=255336&sortid=12
21. InstaMaterial
将概念设计在程序中实现的人是伟大的,作者将 Instagram 的一组
Material 风格的概念设计转变成了现实,非常有借鉴意义。包括水波效 果 ListView 的生动初始化效果,actionbar 元素的进入效果,popmenu 的动画效果等。5 星级代码当之无愧。
项目介绍及其源码下载地址: https://github.com/frogermcs/InstaMaterial
22. Compass
本项目是 MIUI 指南针的社区开源版,由 MIUI 团队(www.miui.com) 发起并贡献第一批代码
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2015/0122/2339.html
23. Omni-Notes
功能相当完善的记事本 app。包括记事分类,涂鸦、添加图片或者其他
附件,日程提醒等记事本常用功能,可以在此基础上做二次开发,但需 要遵守 gpl 协议。依赖了好几个库,又是 studio 开发的,新手编译起来 可能比较吃力。
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2015/0102/2243.html
24. Smart-Note
一个很简单的记事本应用,只有添加和查看功能。适合初学者学习数据 库的基本操作
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2015/0102/2242.html
25. AnimeTaste(全球动画精选)
AnimeTaste(品赏艾尼莫)是国内首个关注独立动画的网站。 移动版 聚焦更新的全球独立动画的传播,让您随时随地能观看动画,分享快乐 给更多好友。品味动画,重拾幻想。 AnimeTaste For Android,为全 球动画爱好者所开发。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1121/2031.html
26. Faceless 匿名聊天应用匿名聊天应用,包括了 android 客户端以及服务端(php)的代码
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1114/1981.html
27. photoup 开源相册
photoup 是一款开源的相册类 app,主要功能是将本地图片提交到 facebook 上去,虽然他的功能和 facebook 的远程服务相关,但是本身 是可以被当作一款相册应用的,具有相册应用需要的绝大多数功能,可 以很流畅的浏览相册,裁剪图片,缩放图片,图片的编辑;不仅如此,还带有人脸识别这种特色功能,如果我们能够吸收其中的知识,写一个 自己的相册应用就得心应手了,因为从本地相册的角度去看,photoup 在用户体验上仍然是值得改进的,仍然值得我们去开发一款相册程序。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1111/1956.html
28. ZhihuPaper
一个「知乎日报」Android 客户端 。经过了一段时间的开发,最初的
设想已经全部完成: 最新新闻、过往的新闻的展示 下拉刷新数据 新 闻正文的展示(WebView 的各种使用) 正文中图片查看、保存至相册 离线下载 夜间模式 收藏夹 已读数据缓存 内容分享至 SNS
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1106/1919.html
29. TTAndroidClient 开源 IM
一个适用于公司内部同事交流的开源 im,该源码是由 Teamtalk 团队贡 献,同时他们开源了其他配套的源码。 因为该项目涉及到侵权已经被 git 下架。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1104/1904.html
30. v2ex-daily:v2ex 网站的 android 客户端
v2ex 是一个创意工作者交流的社区,里面也有很多的程序员,v2ex-daily 是为 v2ex 开发的 android 客户端。可以在 google play 上下载。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1029/1868.html
31. Muzei Live Wallpaper for Android Muzei 壁纸应用
这是已经在 Playstore 上线了的 android 壁纸应用,点击壁纸界面可以 磨砂透明效果以及一般背景效果之间切换,可以自己指定背景图片的来 源。最重要的他是开源的。 有一点需要注意,这个项目使用了 EventBus 库。在 Eclipse 下整个项目要编译起来还是有点困难的。不妨试试Studio。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1024/1834.html
32. MiCode/FileExplorer
小米文件管理器开源版 小米文件管理器的开源版,这是一个完整的文件管理程序,虽然界面一 般,但是功能相对完善,非常适合用来学习。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1023/1830.html
33. QuickNews 新闻客户端
一个不错的新闻客户端,下载下来能用,是结合了很多开源项目制作的, 值得新手参考下,数据也是通过网易和腾讯提供的。 并提供一个 APK 下载地址 大家可以下载下来看看,个人觉得还是很不错的,很多效果 可以运用到自己的项目中去。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2014/1022/1822.html
34. SeeWeather就看天气
是一款遵循 Material Design 风格的只看天气的 APP。无流氓权限,无自启,xxx,用最少的权限做最优的体验。
项目介绍及其源码下载地址: http://www.jcodecraeer.com/a/opensource/2016/0221/3985.html
35. Memo
一款基于 Google Material Design 设计开发的 Android 密码管理客户端
--怕死我的(PassWord)
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2016/0203/3940.html
36. React-Native-Gank
为 Gank.io 做的一个 React-Native 客户端
Update 1st
添加主要逻辑
页面数据API拼接 (拼接到1/15号,具体逻辑还没写)
单页面数据的获取
图形加载
添加主要逻辑
面向对象编程的代码重构
完成首页、历史页
完成内容详情页Header的半透明控制
添加了Navigationbar的自定义组件
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2016/0126/3914.html
37. EasyGank
基于 MVP 模式 , RxJava+RxAndroid+Retrofit 组合的干货集中营客户端。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2016/0119/3885.html
38. CoCoin
CoCoin是一款记账APP,有记账、多种方式显示支出占比和支出变化、云同步、智能提醒等功能。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2016/0114/3865.html
39. SimpleNews
基于 Material Design 和 MVP 的新闻客户端。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1227/3809.html
40. JNote
一款支持部分 Markdown 语法的轻量级便签软件。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1217/3780.html
41. DoubanMovie-React-Native
React Native 的豆瓣电影客户端。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1111/3676.html
42. RxWeather
这是一个简单的天气预报项目,目的是用来演示如何使用 RxJava 构造
一个清晰的 Android 应用框架,并且加入了 Rxbus。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1111/3673.html
43. Hide-Music-Player
Hide 音乐播放器。 1.0 版主要特点 摇一摇进入播放器, 下拉展开新视
图(扫描音乐), 音乐列表放大的动画, 进入页面的圆形动画, 滑动删 除音乐, 更换主题颜色, 自定义的 SwitchButton, 播放页面的模糊背景, 带指示器的自定义 SeekBar, 通知栏显示音乐信息与关闭播放器
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1026/3626.html
44. GankIO
为学习使用 MVP、RxJava、Retrofit 等知识点,作者仿照 @drakeet 的妹纸, 使用 MVP 模式对项目进行重构,让视图层跟业务逻辑向分离,使代码结构更清晰。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1117/3694.html
45. GithubTrends
这是一个用来看查看 Github 热门项目的 Android App, 遵循 Material
Design。 (https://github.com/trending) 支持订阅 50 多种编程语言, 你可以在设置中添加/删除它们,并自定义它们的排序。 支持 9 种颜 色主题切换,支持收藏喜欢的项目。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1015/3583.html
46. githot
GitHot 是一款帮助你寻找 github 上最流行开源项目的 app。 功能比较
简单,就是列举了热门的项目和作者。不过里面用到了很多新技术 RxJava,Dagger,retrofit 等,作为学习材料还是不错的。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1011/3571.html
47. Timber
Material Design 风格的音乐播放器,beta 版本。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/1004/3542.html
48. AnyShareOfAndroid
file transfer on android 仿茄子快传 或者 360 文件传输 在局域网内
(如果没有接收方建立热点,发送方接入热点),进行文件(发送方的 app、图片等文件,项目中只是进行了手机中的第三方 app 和手机图片 的)的传输。
项目介绍及其源码下载地址:http://www.apkbus.com/thread-256272-1-1.html
49. AppPlus
App+是一个 MD 风格的用于传送、提取 APK 文件的开源工具软件。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0928/3529.html
50. Conquer
基于 Material Design 的 todo 应用。 主要功能: 1.根据时间记录任务 2.
定时提醒 3.云同步功能 亮点功能:1.可与好友分享,互相监督 2.界面 简洁精美,用户易操作 3.支持丰富内容,形式多样化。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0928/3527.html
51. ZhiHuDaily-React-Native
使用 React Native for Android 完成的知乎日报 app。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0924/3509.html
52. ToolWizAppLock (密码锁)
一个密码锁应用,加密你的应用,照片,视频文件。 在生活中,你有 没有担心过手机里的某些应用被别人偷看,比如微信聊天记录、短信、 照片? 你是否担心一些重要图片,视频等重要资料被偷窥? 有了密码 锁,您只需将不想被别人查看的应用在我这里锁住,设置好密码,就可 以高枕无忧了! 您只需将重要的图片,视频等文件在我这里加密,再 也不怕被别人窃取你的隐私了!
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0923/3507.html
53. archi
演示和比较如何用不同的架构模式开发安卓 app。同样的 app 使用传统 的模式,MVP 模式,MVVM 模式开发了三次。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0923/3504.html
54. Clip-Stack(剪纸堆 )
剪纸堆 一个超轻量级剪贴板历史记录管理软件。
项目介绍及其源码下载地址:http://www.apkbus.com/thread-256284-1-1.html
55. pocket-note-android
一个简单的记事本 app,具有多色彩主题,自带日历视图,记事可以是
列表显示也可以是网格显示,提醒功能,隐私保护功能等。
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0918/3472.html
56. EWeightScale
一款可以记录和查询体重的应用,功能介绍如下 支持体重数据的添加、 删除、查询等功能 动态生成体重曲线图,支持手势缩放 实时计算 BMI 值,并进行诊断,给出健康体重范围
项目介绍及其源码下载地址:http://www.jcodecraeer.com/a/opensource/2015/0822/3347.html
课表简单查询代码
简单的学习了有关的知识后,在学长的帮助下,我自己写了一个非常简单的课表查询代码,这也是我在夏令营中所学知识的结晶。
MainActivity.java
package com.example.gridview;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private List<String> data_list;
private ArrayAdapter<String> arr_adapter;
private Spinner spinner;
private List<String> list;
private ArrayAdapter<String> adapter;
private static final String TAG ="MainActivity" ;
//学期
private Spinner mSpisemster;
// private EditText mEtsemster;
//班级
private EditText mEtclassName;
//查询按键
private Button mBtnLogin;
private TextView mTvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner) this.findViewById(R.id.spinner1);
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, new String[] { " ","16-17-2", "16-17-1",
"15_16-2","15_16-1","14_15-2","14_15-1","13_14-2"
,"13_14-1","12_13-2","12_13-1","11_12-2","11_12-1","10_11-2","10_11-1","09_10-2","09_10-1","08_09-2","08_09-1","07_08-2"
,"07_08-1","06_07-2","06_07-1","05_06-2","05_06-1","04_05-2","04_05-1","03_04-2","03_04-1","02_03-2","02_03-1","01_02-2"
,"01_02-1" });
//设置下拉样式
adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
spinner.setAdapter(adapter);
initView();
initListener();
}
/**
* 初始化组件
*/
private void initView() {
mSpisemster = (Spinner) findViewById(R.id.spinner1);
// mEtsemster = (EditText) findViewById(R.id.login_et_name);
mEtclassName = (EditText) findViewById(R.id.login_et_pwd);
mBtnLogin = (Button) findViewById(R.id.login_btn_login);
}
/**
* 设置监听器
*/
private void initListener() {
mBtnLogin.setOnClickListener(this);
}
/*
单击事件监听
*/
@Override
public void onClick(View v) {
if(v==mBtnLogin){
//final String Semester = mEtsemster.getText().toString().trim();
final String Semester = mSpisemster.getSelectedItem().toString().trim();
final String ClassName = mEtclassName.getText().toString().trim();
if(TextUtils.isEmpty(Semester) || TextUtils.isEmpty(ClassName)){
Toast.makeText(MainActivity.this, "学期或班级不能为空", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent(this, com.example.gridview.ClassActivity.class);
//向ClassActivity传参数
intent.putExtra("Semester", Semester);
intent.putExtra("ClassName",ClassName);
startActivity(intent);
}
}
}
BeanTable.java
package com.example.gridview;
import java.lang.reflect.Array;
import static android.R.attr.id;
/**
* Created by a302 on 2017/7/26.
*/
public class BeanTable {
private String section;
private String one;
private String two;
private String three;
private String four;
private String five;
private String six;
private String seven;
public String getSection() {
return section;
}
public void setSection(String section) {
this.section = section;
}
public String getOne() {
return one;
}
public void setOne(String one) {
this.one = one;
}
public String getTwo() {
return two;
}
public void setTwo(String two) {
this.two = two;
}
public String getThree() {
return three;
}
public void setThree(String three) {
this.three = three;
}
public String getFour() {
return four;
}
public void setFour(String four) {
this.four = four;
}
public String getFive() {
return five;
}
public void setFive(String five) {
this.five = five;
}
public String getSix() {
return six;
}
public void setSix(String six) {
this.six = six;
}
public String getSeven() {
return seven;
}
public void setSeven(String seven) {
this.seven = seven;
}
}
ClassActivity.java
package com.example.gridview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.GridView;
import com.example.gridview.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class ClassActivity extends AppCompatActivity {
private static final String TAG ="ClassActivity" ;
private GridView gridView;
private String Semester;
private String ClassName;
private final String url ="http://192.168.3.146:8080/Educational/GetJson";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_class);
//gridView = (GridView) findViewById(R.id.gridView1);
gridView = (GridView) findViewById(R.id.gridView);
Semester = getIntent().getStringExtra("Semester");
ClassName = getIntent().getStringExtra("ClassName");
login();
}
/*
查询
*/
prinate void login() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
Bean bean = new Bean();
bean.setSemester(Semester);
bean.setClassName(ClassName);
Gson gson = new Gson();
String strJson = gson.toJson(bean);
//把请求的内容字符串转换为json
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, strJson);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = null;
try {
response = client.newCall(request).execute();
String result = response.body().string();
List<BeanTable> tables = gson.fromJson(result, new
TypeToken<List<BeanTable>>()
{}.getType());
initGridView(tables);
Log.e(TAG, "结果:" + result);
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "错误:" + e.toString());
}
Log.e(TAG, "semester:" + Semester);
Log.e(TAG, "classname:" + ClassName);
}
}).start();
}
private void initGridView(final List<BeanTable> tables) {
runOnUiThread(new Runnable() {
@Override
public void run() {
List<String> strList = new ArrayList<String>();
for (BeanTable table : tables) {
strList.add(table.getSection());
strList.add(table.getOne());
strList.add(table.getTwo());
strList.add(table.getThree());
strList.add(table.getFour());
strList.add(table.getFive());
strList.add(table.getSix());
strList.add(table.getSeven());
}
GridViewAdapter adapter = new GridViewAdapter(ClassActivity.this, strList);
gridView.setAdapter(adapter);
}
});
}
}
GridViewAdapter.java
package com.example.gridview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.gridview.R;
import java.util.ArrayList;
import java.util.List;
import static com.example.gridview.R.id.textView;
/**
* Created by a302 on 2017/7/26.
*/
public class GridViewAdapter extends BaseAdapter {
private Context mContext;
private List<String> stringList = new ArrayList<>();
public GridViewAdapter(Context mContext, List<String> stringList) {
this.mContext = mContext;
this.stringList = stringList;
}
@Override
public int getCount() {
return stringList.size();
}
@Override
public Object getItem(int position) {
return stringList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHodle hodle = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_gridview, null);
hodle = new ViewHodle();
hodle.textView = (TextView) convertView.findViewById(textView);
convertView.setTag(hodle);
} else {
hodle = (ViewHodle) convertView.getTag();
}
hodle.textView.setText(stringList.get(position));
return convertView;
}
class ViewHodle{
private TextView textView;
}
}
HttpUtils.java
package com.example.gridview;
import android.util.Log;
import java.io.IOException;
import android.util.Log;
import com.google.gson.Gson;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import static android.R.attr.password;
/**
* Created by Administrator on 2016-03-27.
*/
public class HttpUtils {
OkHttpClient client = new OkHttpClient();
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
public String login(String url, String json) throws IOException {
//把请求的内容字符串转换 为json
RequestBody body = RequestBody.create(JSON, json);
//RequestBody formBody = new FormEncodingBuilder()
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
String result = response.body().string();
return result;
}
public String bolwingJson(Bean bean) {
Gson gson = new Gson();
String strJson = gson.toJson(bean);
Log.e("strJson", strJson);
return strJson;
}
}
activity_class.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:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#CFCFCF">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text=""
android:textColor="#EE0000"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="星期一"
android:textColor="#EE0000"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="星期二"
android:textColor="#000000"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="星期三"
android:textColor="#EE0000"/>
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="星期四"
android:textColor="#000000"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="星期五"
android:textColor="#EE0000"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="星期六"
android:textColor="#000000"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="星期日"
android:textColor="#EE0000"/>
</LinearLayout>
<GridView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_border"
android:numColumns="8"
android:verticalSpacing="80dp"/>
</LinearLayout>
activity_mian.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textColor="#000000"
/>
</LinearLayout>
item_gridview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textColor="#000000"
/>
</LinearLayout>
Bean.java
package com.example.gridview;
/**
* Created by a302 on 2017/7/26.
*/
public class Bean {
private String Semester;
private String ClassName;
public String getSemester() {
return Semester;
}
public void setSemester(String semester) {
Semester = semester;
}
public String getClassName() {
return ClassName;
}
public void setClassName(String className) {
ClassName = className;
}
}
总结
- 实验室的这段时间,我接触到也学到了很多的东西,这是我意想不到的,觉得自己对编程的理解比不进实验室的同学高了一点,也喜欢上了编程,喜欢用代码自己去创造一个独立的空间,喜欢找bug的感觉,一个bug找不出来连饭都吃得不香,有时候因为找一个bug,经常一个上午没有起过座位,虽然会很累但是我很享受这种感觉,进实验室以后对我整个人都有了很大的改变,特别是眼界有了很大的提升,都说大学生活的懒散的,最好要有一件事或一个人压着你,这样或许才会有所改变,而实验室的任务和老师正是这样一个存在,所以我才会有那么一点的进步。
- 是在这个夏令营中老师还让我们每个人把自己所学的知识,以技术分享的形式向实验室的各个同学们分享,这是我第一次向大家讲解那么专业性的知识,既紧张又害怕,害怕自己讲得不好,然而越害怕什么就来什么,首先是紧张得代码都忘记了,然后是自己的南普让大家听得很不舒服,英语口语方面也是差强人意,以后我会多多锻炼自己口语的方面。在这个期间我也学到了团结的重要性 ,在APP开发的时候真的是缺一环都不得,后台没做好的话前端就测试不了,前端没做好的话也不能测试出后台的是否做好。所以这非常需要我们之间的交流和团结,只有多交流才能做出一个好的项目来。我也非常感谢老师和师兄师姐们的帮助,没有他们的帮助我或许都不能做出想要的结果。总而言之,言而总之,我在 实验室这段时间虽然过得累,但是我有收获,也非常的开心。