仿新闻客户端

这个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;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.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() {
			
			@Override
			public 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")
			@Override
			public void onGlobalLayout() {
				// TODO Auto-generated method stub
				System.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{

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return imageArrayList.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			// TODO Auto-generated method stub
			return arg0==arg1;
		}
		
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			// TODO Auto-generated method stub
			container.addView(imageArrayList.get(position));
			return imageArrayList.get(position);
		}
		
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			// TODO Auto-generated method stub
			container.removeView((View) object);
			//super.destroyItem(container, position, object);
		}
		
	}
	
	class GuidePageListener implements OnPageChangeListener{
		
		
		//滑动状态发生变化
		@Override
		public void onPageScrollStateChanged(int arg0) {
			// TODO Auto-generated method stub
			
		}
		//滑动事件
		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {//当前位置,偏移的百分比,偏移了具体像素
			// TODO Auto-generated method stub
			System.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);//重新给小红点设置布局参数
		}
		//某个页面被选中
		@Override
		public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值