Android移动终端开发大作业.doc

上传人:w****2 文档编号:6666244 上传时间:2020-03-01 格式:DOC 页数:46 大小:382KB
返回 下载 相关 举报
Android移动终端开发大作业.doc_第1页
第1页 / 共46页
Android移动终端开发大作业.doc_第2页
第2页 / 共46页
Android移动终端开发大作业.doc_第3页
第3页 / 共46页
点击查看更多>>
资源描述
Android移动终端开发大作业1、 作业要求l 1人一组,独立完成。l 按照个人兴趣方向,自选题目,完成系统。l 在规定的时间里完成系统主体功能,程序比较稳定的运行。l 手机界面要求简洁、美观,功能不能过于简单,应具备一定的实用性。l 至少要3个Activity以上。l 必须使用自定义Listview,要使用Sqlite数据库或API调用与数据解析(API可使用聚合数据(https:/www.juhe.cn/)、API Store(http:/apistore.baidu.com/)或apix(http:/www.apix.cn/)提供的API,如有能力也可自行开发服务器端)。l 欢迎好的创意作品、实用作品,评分时会适当加分。l 需提交设计报告,设计报告格式见附件,按附件顺序装订(包括评分表)l 大作业成绩从工作量、功能点、创新性、实用性、报告的字数、质量及规范度等方面的成绩构成2、 注意事项l 压缩包内作业内容包括两部分:1 作业项目文件夹,项目必须能够调试通过,android平台选择选择2.2或是2.3.3。2 作业设计说明,word文件。l 可以借鉴网络上的代码,但不可全部照搬。不许相互抄袭,一旦发现成绩为零。附件1:学 号0121309341617成 绩Android平台移动应用开发大 作 业题 目基于Android的新闻浏览软件的设计与实现学 院信息工程学院专 业信息工程班 级信息1303姓 名杏允升指导教师秦珀石2015年12月10日一、 3二、 概述4三、 关键技术5四、 概要设计6五、 系统实现7六、 心得体会81、 概述Android应用平台新闻客户端软件是基于Android手机平台,采用Java语言,从网络上的开放的新闻接口获取数据,设计出针对使用Android平台的手机新闻客户端资讯实时掌控的手机应用程序。 Android平台新闻客户端软件的开发可以进一步扩大时事新闻的覆盖面,让广大公众能够随时随地方便且快捷地获取最新的新闻资讯信息,了解新闻时事,本软件的广泛使用,尤其是在传授知识、普及教育方面起着非常重要的作用。目前市场研究机构Worldpanel发布了全球主要的国家智能手机操作系统在去年Q4内的分布报告,报告指出了谷歌的Android继续保持着增长的势态,但是增幅已经明显放缓了。而在另一个方面,苹果iOS操作系统在全球只能手机市场上均有下滑,个别国家的降幅甚至高达10.3%。最新统计数据中显示,Android操作系统将继续领跑全球市场,包括美国、澳大利亚、中国、意大利、英国、德国、西班牙等所占的市场比例都已经超出50%,并且还将继续呈现上涨的趋势。而在苹果iOS操作系统方面,最大的市场份额所占比的国家依旧是美国,数值为43.9%;紧随美国的则是澳大利亚,数值为35.2%;而在中国方面,市场份额也从21.2%下降到了19%;在意大利,iOS所占的市场份额更是从23.1%猛降至12.8%。从上面的数据可以看出,Android手机软件的开发具有巨大的发展前景,在Android系统上开发出一款手机新闻客户端软件所支持的用户量也是相比较于其他系统多出很多的。谷歌的移动平台主管安迪鲁宾(AndyRubin)表示,跟软件开发合作对象的密切接触正在进行中。Google与开放手机联盟联合开发了Android操作系统,这个联盟由摩托罗拉、高通、宏达电、中国移动和T-Mobile等在内的多家无线应用和技术的领军企业组成。Google通过与设备制造商、开发商、运营商和其他有关各方结成深层次的合作关系,希望借助建立开放式、标准化的移动移动电话软件平台,在移动产业内形成一个开放性的生态系统,这将是开发Android软件的一个契机,Android平台的开发在将来必定大放异彩。2、 关键技术1) 使用ViewPager里面添加多张图片配合线程延时实现轮播图的自没有通过ScheduledExecutorService或Timer定期执行某个任务实现,而是简单的通过handler发送消息去完成一次滚动,在完成一次滚动后发送另外一个delay的滚动消息,如此循环实现。自动滚动部分核心代码如下:至于ViewPager嵌套引起子ViewPager无法触摸问题是通过在子ViewPager的onTouchEvent中添加禁止父控件对touch event做intercept解决的。ViewPager滑动速度的设置是通过反射的方式重新设置ViewPager的Scroller,改变Scroller的startScroll的间隔时间完成的。调用setScrollDurationFactor(double)即可。2、使用(1) 引入公共库引入Android Auto Scroll ViewPagerGithub作为你项目的library(如何拉取代码及添加公共库)。(2) 调用仅需简单两步:a. 布局定义代替一般的ViewPager定义 b. 启动ViewPager自动滚动startAutoScroll() 启动自动滚动stopAutoScroll() 停止自动滚动3、设置setInterval(long) 设置自动滚动的间隔时间,单位为毫秒setDirection(int) 设置自动滚动的方向,默认向右setCycle(boolean) 是否自动循环轮播,默认为truesetScrollDurationFactor(double) 设置ViewPager滑动动画间隔时间的倍率,达到减慢动画或改变动画速度的效果setStopScrollWhenTouch(boolean) 当手指碰到ViewPager时是否停止自动滚动,默认为truesetSlideBorderMode(int) 滑动到第一个或最后一个Item的处理方式,支持没有任何操作、轮播以及传递到父View三种模式setBorderAnimation(boolean) 设置循环滚动时滑动到从边缘滚动到下一个是否需要动画,默认为true4、其他(1) 指示器,圆形或是方形指示器请配合ViewPagerIndicator使用(2)无限循环,如果希望在最后一张继续播放第一张而不是退回到第一张,请参考AutoScrollViewPagerSingleDemo.java,注意这个特性不能和 ViewPagerIndicator 使用2)使用viewpager结合ViewPageIndicator进行新闻类别的分类切换,可点击切换也可以滑动切换。1. ViewPager Indicator的Library查看Viewpager Indicator的Library代码,可以看到此项目的设计思想:首先定义了一个PageIndicator接口,它里面定义了最重要和基本的indicator表现出的一些方法: 1.1 首先一个indicator必须要与一个ViewPager关联在一起,所以它提供了一个setViewPager方法。 1.2 它扩展了ViewPager.OnPageChangeListener接口,表示接管了ViewPager的Pager改变时的监听处理, 这也是为什么为ViewPager设置OnPageChangeListener监听器时不能设置在ViewPager上而必须设置在 indicator上的原因。 1.3 还有一个notifyDataSetChanged通知方法,表示为这个ViewPager提供View(一般是Fragment)的 Adapter 里面的数据集发生变化时,执行的动作,这里可增加相关的逻辑。2. Viewpager Indicator的实现类然后再看下Viewpager Indicator的实现类,共有6个,由6个类分别实现,它们分别为: 2.1 小圆圈类型的 2.2 带图标类型的 2.3 小横线类型的,距离屏幕最下边端有一定的距离。 2.4 标签类型的(Tab) 2.5 标题类型的,与标签类型的有点像,但它当前的标题页的左/右边的标题会卷起,即往两端缩进去。 2.6 屏幕底部小横线类型的,并且会占满整行。 3. Viewpager Indicator随附带的Demo Demo项目的设计 项目由一个ListSamples的ListActivity入口,它主要用作组装所有的子indicator的列表。 TestFragment.java,所有ViewPager上真正显示的视图。 TestFragmentAdapter.java,所有ViewPager里的Adapter,为ViewPager生成TestFragment。 Samplexxx.java,所有的indicator的显示,一个类显示一种使用方法或特性2)使用viewpager结合ViewPageIndicator进行新闻类别的分类切换,可点击切换也可以滑动切换。3)使用Gson对新闻数据的json字符串进行解析显示到listview上需要使用jar包fastjson或gson这两个jar包。/Gson的使用方式Gson gson=newGson();String str=ReadAssetsFile.readtext(this,json_ss);/this当前类,json_ss需要解析的文件名 UserMessage userMessage=gson.fromJson(str,UserMessage.class);/需要解析的json文件最外层类名 /fastjson的使用方法 String json=ReadAssetsFile.readtxt(this,json_h); UserMessage user = JSON.parseObject(json,UserMessage.class);自己扩展4)使用Universal-Image-Loader对图片进行缓存加载Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进。特性列举:多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置支持图片的内存缓存,文件系统缓存或者SD卡缓存支持图片下载过程的监听根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片提供在较慢的网络下对图片进行加载使用过程:创建默认的ImageLoader,所有的操作都由ImageLoader控制。该类使用单例设计模式,所以如果要获取该类的实力,需要调用getInstance()方法。在使用ImageLoader显示图片之前,你首先要初始化它的配置,调用ImageLoaderConfiguration的init()方法,然后你就可以实现各种的显示了。自定义配置imageloader, 就像你已经知道的,首先,你需要使用ImageLoaderConfiguration对象来初始化ImageLoader。由于ImageLoader是单例,所以在程序开始的时候只需要初始化一次就好了。建议你在Activity的onCreate()方法中初始化。如果一个ImageLoader已经初始化过,再次初始化不会有任何效果。下面我们通过ImageLoaderConfiguration.Builder创建一个设置得到imageLoader使用过程:(1) 图像操作是否参与缓存以及图像效果的配置操作DisplayImageOptions以下是所有默认配置参数根据需求可以自定义配置(2)图片加载监听器在这里吧可以设置加载时的动画或者进度条之类的东西这里(3)简单设置就可以给ImageView添加图片了对于本地的图片 ,在其绝对地址前面要加入file:/。网络图片就直接写路径了。缓存的清理:缓存的清理可以按需求来定,可以再每个Activity的生命周期函数onDestroy中清理也可以单独设置让用户自行清理。GirdView,ListView加载图片:相信大部分人都是使用GridView,ListView来显示大量的图片,而当我们快速滑动GridView,ListView,我们希望能停止图片的加载,而在GridView,ListView停止滑动的时候加载当前界面的图片,这个框架当然也提供这个功能,使用起来也很简单,它提供了PauseOnScrollListener这个类来控制ListView,GridView滑动过程中停止去加载图片,该类使用的是代理模式第一个参数就是我们的图片加载对象ImageLoader, 第二个是控制是否在滑动过程中暂停加载图片,如果需要暂停传true就行了,第三个参数控制猛的滑动界面的时候图片是否加载概要设计Json数据的一些返回参数名称类型说明 error_codeint返回码 reasonstring返回说明 resultstring返回结果集 titlestring新闻标题 contentstring新闻摘要内容 img_widthstring图片宽度 full_titlestring完整标题 pdatestring发布时间 srcstring新闻来源 img_lengthstring图片高度 imgstring图片链接 urlstring新闻链接 pdate_srcstring发布完整时间三、系统实现代码1:package com.name.xinwen;import com.thinkland.sdk.android.JuheSDKInitializer;import android.app.Application;import android.content.Context;import android.os.Handler;import android.os.Looper;/* * 应用程序的入口 */public class BaseApplication extends Application private static Context mContext;private static Thread mMainThread;private static int mMainThreadId;private static Handler mMainThreadHandler;private static Looper mMainThreadLooper;Overridepublic void onCreate() super.onCreate();JuheSDKInitializer.initialize(getApplicationContext();/在应用程序入口提供全局的工具/上下文mContext = this;/主线程和子线程mMainThread = Thread.currentThread();/mMainThreadId = mMainThread.getId();/当前应用程序进程ID/mMainThreadId = android.os.Process.myPid();/ 线程id myTid();mMainThreadId = android.os.Process.myTid();/用户id myUid();/主线程handlermMainThreadHandler = new Handler();mMainThreadLooper = getMainLooper();public static Context getContext()return mContext;public static Thread getMainThread()return mMainThread;public static int getMainThreadId()return mMainThreadId;public static Handler getMainThreadHandler()return mMainThreadHandler;public static Looper getMainThreadLooper()return mMainThreadLooper;package com.name.xinwen;import com.thinkland.sdk.android.JuheSDKInitializer;import android.app.Application;import android.content.Context;import android.os.Handler;import android.os.Looper;/* * 应用程序的入口 */public class BaseApplication extends Application private static Context mContext;private static Thread mMainThread;private static int mMainThreadId;private static Handler mMainThreadHandler;private static Looper mMainThreadLooper;Overridepublic void onCreate() super.onCreate();JuheSDKInitializer.initialize(getApplicationContext();/在应用程序入口提供全局的工具/上下文mContext = this;/主线程和子线程mMainThread = Thread.currentThread();/mMainThreadId = mMainThread.getId();/当前应用程序进程ID/mMainThreadId = android.os.Process.myPid();/ 线程id myTid();mMainThreadId = android.os.Process.myTid();/用户id myUid();/主线程handlermMainThreadHandler = new Handler();mMainThreadLooper = getMainLooper();public static Context getContext()return mContext;public static Thread getMainThread()return mMainThread;public static int getMainThreadId()return mMainThreadId;public static Handler getMainThreadHandler()return mMainThreadHandler;public static Looper getMainThreadLooper()return mMainThreadLooper;代码2:/* * Copyright (C) 2013 Andreas Stuetz * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http:/www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.xinwen.indicator.lib;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Typeface;import android.os.Build;import android.os.Parcel;import android.os.Parcelable;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.TypedValue;import android.view.Gravity;import android.view.View;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.widget.HorizontalScrollView;import android.widget.ImageButton;import android.widget.LinearLayout;import android.widget.TextView;import java.util.Locale;import org.itheima51.indicator.lib.R;public class TabSlidingIndicator extends HorizontalScrollViewpublic interface IconTabProviderpublic int getPageIconResId(int position);/ formatter:offprivate static final int ATTRS = new int android.R.attr.textSize,android.R.attr.textColor ;/ formatter:onprivate LinearLayout.LayoutParamsdefaultTabLayoutParams;private LinearLayout.LayoutParamsexpandedTabLayoutParams;private final PageListenerpageListener= new PageListener();public OnPageChangeListenerdelegatePageListener;private LinearLayouttabsContainer;private ViewPagerpager;private inttabCount;private intcurrentPosition= 0;private floatcurrentPositionOffset= 0f;private PaintrectPaint;private PaintdividerPaint;private intindicatorColor= 0xFF666666;private intunderlineColor= 0x1A000000;private intdividerColor= 0x1A000000;private booleanshouldExpand= false;private booleantextAllCaps= true;private intscrollOffset= 52;private intindicatorHeight= 8;private intunderlineHeight= 2;private intdividerPadding= 12;private inttabPadding= 24;private intdividerWidth= 1;private inttabTextSize= 12;private inttabTextColor= 0xFF666666;private inttabNormalTextColor= 0xFF666666;private inttabSelectedTextColor= 0xFFFF0000;private TypefacetabTypeface= null;private inttabTypefaceStyle= Typeface.BOLD;private intlastScrollX= 0;private inttabBackgroundResId= R.drawable.background_tab;private Localelocale;public TabSlidingIndicator(Context context) this(context, null);public TabSlidingIndicator(Context context, AttributeSet attrs) this(context, attrs, 0);public TabSlidingIndicator(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle);setFillViewport(true);setWillNotDraw(false);tabsContainer = new LinearLayout(context);tabsContainer.setOrientation(LinearLayout.HORIZONTAL);tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);addView(tabsContainer);DisplayMetrics dm = getResources().getDisplayMetrics();scrollOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, scrollOffset, dm);indicatorHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, indicatorHeight, dm);underlineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, underlineHeight, dm);dividerPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerPadding, dm);tabPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, tabPadding, dm);dividerWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerWidth, dm);tabTextSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, tabTextSize, dm);/ get system attrs (android:textSize and android:textColor)TypedArray a = context.obtainStyledAttributes(attrs, ATTRS);tabTextSize = a.getDimensionPixelSize(0, tabTextSize);tabTextColor = a.getColor(1, tabTextColor);a.recycle();/ get custom attrsa = context.obtainStyledAttributes(attrs, R.styleable.TabSlidingIndicator);indicatorColor = a.getColor(R.styleable.TabSlidingIndicator_pstsIndicatorColor, indicatorColor);underlineColor = a.getColor(R.styleable.TabSlidingIndicator_pstsUnderlineColor, underlineColor);dividerColor = a.getColor(R.styleable.TabSlidingIndicator_pstsDividerColor, dividerColor);indicatorHeight = a.getDimensionPixelSize(R.styleable.TabSlidingIndicator_pstsIndicatorHeight, indicatorHeight);underlineHeight = a.getDimensionPixelSize(R.styleable.TabSlidingIndicator_pstsUnderlineHeight, underlineHeight);dividerPadding = a.getDimensionPixelSize(R.styleable.TabSlidingIndicator_pstsDividerPadding, dividerPadding);tabPadding = a.getDimensionPixelSize(R.styleable.TabSlidingIndicator_pstsTabPaddingLeftRight, tabPadding);tabBackgroundResId = a.getResourceId(R.styleable.TabSlidingIndicator_pstsTabBackground, tabBackgroundResId);shouldExpand = a.getBoolean(R.styleable.TabSlidingIndicator_pstsShouldExpand, shouldExpand);scrollOffset = a.getDimensionPixelSize(R.styleable.TabSlidingIndicator_pstsScrollOffset, scrollOffset);textAllCaps = a.getBoolean(R.styleable.TabSlidingIndicator_pstsTextAllCaps, textAllCaps);a.recycle();rectPaint = new Paint();rectPaint.setAntiAlias(true);rectPaint.setStyle(Style.FILL);dividerPaint = new Paint();dividerPaint.setAntiAlias(true);dividerPaint.setStrokeWidth(dividerWidth);defaultTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);expandedTabLayoutParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f);if (locale = null)locale = getResources().getConfiguration().locale;public void setViewPager(ViewPager pager)this.pager = pager;if (pager.getAdapter() = null) throw new IllegalStateException(ViewPager does not have adapter instance.); pager.setOnPageChangeListener(pageListener);notifyDataSetChanged();public void setOnPageChangeListener(OnPageChangeListener listener)this.delegatePageListener = listener;public void notifyDataSetChanged()tabsContainer.removeAllViews();tabCount = pager.getAdapter().getCount();for (int i = 0; i tabCount; i+)if (pager.getAdapter() instanceof IconTabProvider)addIconTab(i, (IconTabProvider) pager.getAdapter().getPageIconResId(i);elseaddTextTab(i, pager.getAdapter().getPageTitle(i).toString();updateTabStyles();getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() SuppressWarnings(deprecation)SuppressLint(NewApi)Overridepublic void onGlobalLayout()if (Build.VERSION.SDK_INT Build.VERSION_CODES.JELLY_BEAN)getViewTreeObserver().removeGlobalOnLayoutListener(this);elsegetViewTreeObserver().removeOnGlobalLayoutListener(this);currentPosition = pager.getCurrentItem();scrollToChild(currentPosition, 0);if (pageListener != null)pageListener.onPageSelected(currentPosition););private void addTextTab(final int position, String title)TextView tab = new TextView(getContext();tab.setText(title);tab.setGravity(Gravity.CENTER);tab.setSingleLine();addTab(position, tab);private void addIconTab(final int position, int resId)ImageButton tab = new ImageButton(getContext();tab.setImageResource(resId);addTab(position, tab);private void addTab(final int position, View tab)tab.setFocusable(true);tab.setOnClickListener(new OnClickListener() Overridepublic void onClick(View v)pager.setCurrentItem(position););tab.setPadding(tabPadding, 0, tabPadding, 0);tabsContainer.addView(tab, position, shouldExpand ? expandedTabLayoutParams : defaultTabLayoutParams);private void updateTabStyles()for (int i = 0; i = Build.VERSION_CODES.ICE_CREAM_SANDWICH)tab.setAllCaps(true);elsetab.setText(tab.getText().toString().toUpperCase(locale);private void scrollToChild(int position, int offset)if (tabCount = 0) return; int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset;if (position 0 | offset 0)newScrollX -= scrollOffset;if (newScrollX != lastScrollX)lastScrollX = newScrollX;scrollTo(newScrollX, 0);Overrideprotected void onDraw(Canvas canvas)super.onDraw(canvas);if (isInEditMode() | tabCount = 0) return; final int height = getHeight();/ draw indicator linerectPaint.setColor(indicatorColor);/ default: line below current tabView currentTab = tabsContainer.
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!