首页 > 代码库 > 仿网易新闻广告启动页的实现

仿网易新闻广告启动页的实现

由于项目的需要,需要实现类似网易新闻广告启动页类似的效果就自己动手写了一个,主要功能如下:

第一:在启动应用的时候,首先显示第一张图片;

第二:接着淡入第二张图片(采用动画实现);

第三:动画结束之后,可以点击图片,直接进入广告详情页;

第四:若是不点击广告,则三秒后,自动进入首页面;

源代码如下:

public class MainActivity extends Activity implements OnClickListener {

	private ImageView firstImage = null;
	private ImageView secondImage = null;
	private int runCount = 0;// 线程执行的次数
	private Animation inAnimation;// 显示图片的动画

	final Handler handler = new Handler();

	private Boolean flag = false;// 是否点击广告

	private Timer mTimer = null;
	private TimerTask mTimerTask = null;
	private long delay = 4000;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		firstImage = (ImageView) findViewById(R.id.first_img);// 显示的第一张图
		secondImage = (ImageView) findViewById(R.id.second_img);// 渐入的第二张图

		firstImage.setOnClickListener(this);
		secondImage.setOnClickListener(this);

		inAnimation = AnimationUtils.loadAnimation(this, R.anim.fade);// 定义一个渐入的动画
		
		adCanClick();//这样设置是为了在动画播放完毕之后可以点击广告图片,否则可能会出现异常
		
		runCount = 0;// 全局变量,用于判断是否是第一次执行
		Runnable runnable = new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				if (runCount == 1) {// 第一次执行则关闭定时执行操作
					// 在此处添加执行的代码
					secondImage.setVisibility(View.VISIBLE);
					secondImage.startAnimation(inAnimation);
					
					startTimer();
					
					handler.removeCallbacks(this);// 停止计时器:删除指定的Runnable对象,使线程对象停止运行
				}

				if (runCount == 0) {// 只让该线程执行一次
					handler.postDelayed(this, 100);// 而Runnable中的150毫秒表示每隔150毫秒秒执行一次你的功能模块;
				}
				runCount++;
			}

		};

		handler.postDelayed(runnable, 1000);// 打开定时器,执行操作:postDelay中的1秒表示程序运行到此处延迟一秒开启这个handler
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.first_img:
			flag = true;// 说明在广告展示的三秒之内点击了查看广告
			stopTimer();// 先关闭
			startTimer();// 再打开
			break;

		case R.id.second_img:
			flag = true;// 说明在广告展示的三秒之内点击了查看广告
			stopTimer();
			startTimer();
			break;
		default:
			break;
		}
	}

	/**
	 * 打开timer
	 */
	private void startTimer() {
		if (mTimer == null) {
			mTimer = new Timer();
		}

		if (mTimerTask == null) {
			mTimerTask = new TimerTask() {
				@Override
				public void run() {
					if (flag) {
						Intent intent = new Intent(MainActivity.this,
								AdActivity.class);
						startActivity(intent);
						stopTimer();
					} else {
						Intent intent = new Intent(MainActivity.this,
								MainPageActivity.class);
						startActivity(intent);
						stopTimer();
					}
				}
			};
		}

		if(flag){//如果点击按钮了,则重设delay的时间,从而使立即执行该操作
			delay = 100;
		}
		
		if (mTimer != null && mTimerTask != null)
			mTimer.schedule(mTimerTask, delay);
	}

	/**
	 * 关闭timer
	 */
	private void stopTimer() {

		if (mTimer != null) {
			mTimer.cancel();
			mTimer = null;
		}

		if (mTimerTask != null) {
			mTimerTask.cancel();
			mTimerTask = null;
		}
	}
	
	/**
	 * 广告可以点击
	 */
	private void adCanClick(){
		firstImage.setClickable(false);
		secondImage.setClickable(false);
		new Timer().schedule(new TimerTask() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				firstImage.setClickable(true);
				secondImage.setClickable(true);
			}
		}, 2100);//2100这个时间是启动到动画播放完毕的时间
	}

}

仿网易新闻广告启动页的实现