仿新闻客户端

来源:互联网 发布:淘宝定制商品规则买家 编辑:程序博客网 时间:2024/06/07 06:51

这个Demo是学习android后的第一个项目,此项目主要应用在Android 4.0以上的版本,其技术实现上主要用到了Android常用的UI控件,网络数据交互,ListView数据的分页加载(下拉刷新,上拉加载更多),三级缓存,第三方分享等.

为了实现图片的轮播效果以及实现左侧侧滑事件,实现滑动及点动切换界面效果,导入第三方包slidingmenu_library、ImageSlider_library才将其实现;实现上拉加载更多、下拉刷新使用了第三包Android-XListView-library;由于是初学不久后的一个练习项目,在界面的资源的显示是应用的是网易新闻客户端资源。为了实现资源的缓存效果,在断网的情况下也能显示之前加载的内容,引入了xUtils框架。新闻当中的内容是从网上获取,当网上的数据发生改变的时候,新闻中的内容也将相应的进行改变,因此实现了新闻时事同步功能。由于xUtils框架中封装了图片和资源缓存,故在加载了后数据将会被保存,所有在没有网络的情况下也能显示之前加载的数据信息  

其中为实现新手引导页特效,源码如下:

import java.util.ArrayList;import com.example.zhihuibeijing.utils.DensityUtils;import com.example.zhihuibeijing.utils.PrefUtils;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.view.Window;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;public class GuideActivity extends Activity {private ViewPager vpGuidePager;private static final int[] imgIds = new int[]{R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3};private ArrayList<ImageView> imageArrayList;private LinearLayout llPointGroup;//引导圆点的父控件private int mPointWidth; //圆点间的距离private View pointRed;private Button btstart;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_guide);llPointGroup = (LinearLayout) findViewById(R.id.ll_point_gray);vpGuidePager = (ViewPager) findViewById(R.id.vp_guide);pointRed = findViewById(R.id.point_red);btstart = (Button) findViewById(R.id.bt_start);initViews();vpGuidePager.setAdapter(new myadapter());vpGuidePager.setOnPageChangeListener(new GuidePageListener());btstart.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//点击"开始体验"按钮后   在sp中写入true,使新手引导页在下次开启时不会展示PrefUtils.setBoolean(GuideActivity.this, "is_user_guide_showed", true);startActivity(new Intent(GuideActivity.this, MainActivity.class));finish();}});}private void initViews(){imageArrayList = new ArrayList<ImageView>();//初始化引导页的三个页面for (int i = 0; i < imgIds.length; i++) {ImageView imageView = new ImageView(this);imageView.setBackgroundResource(imgIds[i]);imageArrayList.add(imageView);}//初始化 引导页的小圆点for (int i = 0; i < imgIds.length; i++) {//圆点数量由加载的imageView确定View point = new View(this);point.setBackgroundResource(R.drawable.shape_point_gray);//设置引导页默认圆点LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(DensityUtils.dp2px(this, 10),DensityUtils.dp2px(this, 10));if (i>0) {params.leftMargin = DensityUtils.dp2px(this, 10);//设置小圆点之间的间隔  (判断是从第二个小圆点开始)}point.setLayoutParams(params);//设置引导圆点的大小llPointGroup.addView(point);//在父控件中添加point   把圆点添加给线性布局}//对layout结束事件进行监听// ViewTreeObserver  获取视图树llPointGroup.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {//当Layout执行结束后回调此方法@SuppressWarnings("deprecation")@Overridepublic void onGlobalLayout() {// TODO Auto-generated method stubSystem.out.println("layour  ----结束");//监听执行一次后删除,避免系统多次回调时出现多次监听事件llPointGroup.getViewTreeObserver().removeGlobalOnLayoutListener(this);/** * measure(先测量)     layout(确定界面位置)  ondrraw(进行绘制) * 获取小圆点的相对距离     也就是红色小圆点的移动距离   从而实现红色圆点跟随滑动进行移动 *  不能直接获取的原因:初始化视图还没有layout  无法获取距离 ,通过视图树监听layout结束,从而获取距离        * */mPointWidth =  llPointGroup.getChildAt(1).getLeft()-llPointGroup.getChildAt(0).getLeft();System.out.println("小灰点间隔距离:"+mPointWidth);}}); }class myadapter extends PagerAdapter{@Overridepublic int getCount() {// TODO Auto-generated method stubreturn imageArrayList.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0==arg1;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubcontainer.addView(imageArrayList.get(position));return imageArrayList.get(position);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stubcontainer.removeView((View) object);//super.destroyItem(container, position, object);}}class GuidePageListener implements OnPageChangeListener{//滑动状态发生变化@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}//滑动事件@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {//当前位置,偏移的百分比,偏移了具体像素// TODO Auto-generated method stubSystem.out.println("GuideActivity.GuidePageListener.onPageScrolled()"+"当前位置:"+arg0+"____"+"百分比:"+arg1+"___"+"移动距离:"+arg2+"____");int len =(int) (mPointWidth*arg1)+arg0*mPointWidth;//int len = mPointWidth*(arg0+agr1);System.out.println("距离:"+len);//获取当前小红点的布局参数   RelativeLayout.LayoutParams params =  (RelativeLayout.LayoutParams) pointRed.getLayoutParams();   //设置左边距   params.leftMargin = len;//      pointRed.setLayoutParams(params);//重新给小红点设置布局参数}//某个页面被选中@Overridepublic void onPageSelected(int arg0) {//// TODO Auto-generated method stub//设置  开始体验 按钮 的显示 时间if (arg0==imgIds.length-1) {btstart.setVisibility(View.VISIBLE);}else {btstart.setVisibility(View.INVISIBLE);}}}}

通过该项目的练习,初步认识到Android开发的项目流程,熟悉了从服务器获取数据并显示到界面上的使用,同时也对第三方包的使用进行了了解。对于xUtils框架的使用及功能有所掌握,其间封装了网络数据解析、缓存.对shareSDK第三方分享使用由于时间的关系,List点击事件及侧滑中的点击事件暂时还没有实现;在和面将不断的对其功能进行完善。


1 0
原创粉丝点击