Android仿人人客户端(v5.7.1)——欢迎和导引界面的编码实现
转载请标明出处:http://blog.csdn.net/android_ls/article/details/8711766
声明:仿人人项目,所用所有图片资源都来源于官方人人android客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片。
一、应用框架搭建,自定义类继承Application,用于存放全局变量和公用的资源等,代码如下:
package com.copyeveryone.android; import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.app.Application; /** * 功能描述:用于存放全局变量和公用的资源等 * @author android_ls */ public class CopyEveryoneApplication extends Application { private List<Activity> activitys = new LinkedList<Activity>(); // 应用程序的入口 @Override public void onCreate() { } public void addActivity(Activity activity) { activitys.add(activity); } @Override public void onTerminate() { for (Activity activity : activitys) { activity.finish(); } System.exit(0); } }
二、应用中界面(Activity)的基类,代码如下:
package com.copyeveryone.android; import android.app.Activity; import android.os.Bundle; import android.widget.Toast; /** * 功能描述:应用中界面(Activity)的基类 * 对原有的Activity类进行扩展 * @author android_ls */ public abstract class AppBaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((CopyEveryoneApplication) this.getApplication()).addActivity(this); setContentView(getLayoutId()); // 初始化组件 setupView(); // 初始化数据 initializedData(); } /** * 布局文件ID * @return */ protected abstract int getLayoutId(); /** * 初始化组件 */ protected abstract void setupView(); /** * 初始化数据 */ protected abstract void initializedData(); /** * 显示Toast形式的提示信息 * @param message */ protected void show(String message) { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); } }
三、欢迎界面(LOGO)的实现,代码如下:
package com.copyeveryone.android.ui; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.CountDownTimer; import com.copyeveryone.android.R; /** * 功能描述:欢迎界面(LOGO) * @author android_ls */ public class WelcomeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.welcome); new CountDownTimer(1000, 1000) { @Override public void onTick(long millisUntilFinished) { // TODO Auto-generated method stub } @Override public void onFinish() { Intent intent = new Intent(WelcomeActivity.this, GuideActivity.class); startActivity(intent); WelcomeActivity.this.finish(); } }.start(); } }
布局文件welcome.xml:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/v5_0_1_welcome" android:orientation="vertical" />
四、导引界面的实现,界面效果动画原理:每张图片都执行的动画顺序,渐现、放大和渐隐,结束后切换图片和文字又开始执行 渐现、放大和渐隐...,当最后一张执行完渐隐,切换到第一张,从而达到循环效果。具体代码如下:
package com.copyeveryone.android.ui; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import com.copyeveryone.android.AppBaseActivity; import com.copyeveryone.android.R; /** * 功能描述:导引界面 * 界面效果动画原理:每张图片都执行的动画顺序,渐现、放大和渐隐,结束后切换图片和文字 * 又开始执行 渐现、放大和渐隐...,当最后一张执行完渐隐,切换到第一张,从而达到循环效果。 * @author android_ls */ public class GuideActivity extends AppBaseActivity implements View.OnClickListener { /** * 注册按钮 */ private Button btnRegister; /** * 看看我认识的人按钮 */ private Button btnLookAtThePeopleIKnow; /** * 登录按钮 */ private Button btnLogin; /** * 显示图片的ImageView组件 */ private ImageView ivGuidePicture; /** * 显示图片的对应的文字描述文本组件 */ private TextView tvGuideContent; /** * 要展示的一组图片资源 */ private Drawable[] pictures; /** * 每张展示图片要执行的一组动画效果 */ private Animation[] animations; /** * 当前执行的是第几张图片(资源索引) */ private int position = 0; /** * 要展示的图片对应的文本描述(图片与文字一一对应) */ private String[] texts = { "儿时友,莫相忘", "同学情,请珍藏", "共奋斗,同分享", "感谢一路有你", "青春勇敢飞翔", "理想从未远去" }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tvGuideContent.setText(texts[position]); ivGuidePicture.setImageDrawable(pictures[position]); ivGuidePicture.startAnimation(animations[0]); } @Override protected int getLayoutId() { return R.layout.guide; } @Override protected void setupView() { ivGuidePicture = (ImageView) findViewById(R.id.iv_guide_picture); tvGuideContent = (TextView) findViewById(R.id.tv_guide_content); btnRegister = (Button) findViewById(R.id.btn_register); btnLookAtThePeopleIKnow = (Button) findViewById(R.id.btn_look_at_the_people_i_know); btnLogin = (Button) findViewById(R.id.btn_login); btnRegister.setOnClickListener(this); btnLookAtThePeopleIKnow.setOnClickListener(this); btnLogin.setOnClickListener(this); } @Override protected void initializedData() { pictures = new Drawable[] { getResources().getDrawable(R.drawable.v5_0_1_guide_pic1), getResources().getDrawable(R.drawable.v5_0_1_guide_pic2), getResources().getDrawable(R.drawable.v5_0_1_guide_pic3), getResources().getDrawable(R.drawable.v5_3_0_guide_pic1), getResources().getDrawable(R.drawable.v5_3_0_guide_pic2), getResources().getDrawable(R.drawable.v5_3_0_guide_pic3) }; animations = new Animation[] { AnimationUtils.loadAnimation(this, R.anim.v5_0_1_guide_welcome_fade_in), AnimationUtils.loadAnimation(this, R.anim.v5_0_1_guide_welcome_fade_in_scale), AnimationUtils.loadAnimation(this, R.anim.v5_0_1_guide_welcome_fade_out) }; animations[0].setDuration(1500); animations[1].setDuration(3000); animations[2].setDuration(1500); animations[0].setAnimationListener(new GuideAnimationListener(0)); animations[1].setAnimationListener(new GuideAnimationListener(1)); animations[2].setAnimationListener(new GuideAnimationListener(2)); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_register: show("抱歉,该功能暂未提供!"); break; case R.id.btn_look_at_the_people_i_know: show("抱歉,该功能暂未提供!"); break; case R.id.btn_login: break; default: break; } } class GuideAnimationListener implements AnimationListener { private int index; public GuideAnimationListener(int index) { this.index = index; } @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { if (index < (animations.length - 1)) { ivGuidePicture.startAnimation(animations[index + 1]); } else { position++; if (position > (pictures.length - 1)) { position = 0; } System.out.println("position = " + position); tvGuideContent.setText(texts[position]); ivGuidePicture.setImageDrawable(pictures[position]); ivGuidePicture.startAnimation(animations[0]); } } @Override public void onAnimationRepeat(Animation animation) { } } }
布局文件guide.xml:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageView android:id="@+id/iv_guide_picture" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:scaleType="fitXY" /> <LinearLayout android:id="@+id/ll_bottom_action_bar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" android:padding="7dip" > <Button android:id="@+id/btn_register" android:layout_width="fill_parent" android:layout_height="45dip" android:layout_weight="1.5" android:background="@drawable/guide_btn_blue_selector" android:gravity="center" android:singleLine="true" android:text="注 册" android:textColor="#FFFFFF" android:textSize="15.0sp" /> <Button android:id="@+id/btn_look_at_the_people_i_know" android:layout_width="fill_parent" android:layout_height="45dip" android:layout_marginLeft="8dip" android:layout_marginRight="8dip" android:layout_weight="1.0" android:background="@drawable/guide_btn_white_selector" android:gravity="center" android:singleLine="true" android:text="看看我认识的人" android:textColor="#000000" android:textSize="15.0sp" /> <Button android:id="@+id/btn_login" android:layout_width="fill_parent" android:layout_height="45dip" android:layout_weight="1.5" android:background="@drawable/guide_btn_blue_selector" android:gravity="center" android:singleLine="true" android:text="登 录" android:textColor="#FFFFFF" android:textSize="15.0sp" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_above="@+id/ll_bottom_action_bar" android:layout_marginBottom="40dip" android:orientation="vertical" > <TextView android:id="@+id/tv_guide_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center" android:textColor="#FFFFFF" android:textSize="25.0sp" android:textStyle="bold" /> </LinearLayout> </RelativeLayout> </FrameLayout>
资源文件guide_btn_blue_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/v5_0_1_guide_blue_default" android:state_focused="true" android:state_pressed="false"/> <item android:drawable="@drawable/v5_0_1_guide_blue_press" android:state_pressed="true"/> <item android:drawable="@drawable/v5_0_1_guide_blue_default"/> </selector>
资源文件guide_btn_white_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/v5_0_1_guide_black_default" android:state_focused="true" android:state_pressed="false"/> <item android:drawable="@drawable/v5_0_1_guide_black_press" android:state_pressed="true"/> <item android:drawable="@drawable/v5_0_1_guide_black_default"/> </selector>
渐入动画资源文件v5_0_1_guide_welcome_fade_in.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:fromAlpha="0.0" android:toAlpha="1.0" /> </set>
放大动画资源文件v5_0_1_guide_welcome_fade_in_scale.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:fillAfter="false" android:fromXScale="1.0" android:fromYScale="1.0" android:interpolator="@android:anim/decelerate_interpolator" android:pivotX="50.0%" android:pivotY="50.0%" android:toXScale="1.1" android:toYScale="1.1" /> </set>
渐隐动画资源文件v5_0_1_guide_welcome_fade_out.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:fillAfter="false" android:fromXScale="1.1" android:fromYScale="1.1" android:interpolator="@android:anim/decelerate_interpolator" android:pivotX="50.0%" android:pivotY="50.0%" android:toXScale="1.1" android:toYScale="1.1" /> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>
注:所涉及的图片在人人官方的android应用中都有。
五、运行效果图:
本来想录段视频,动画效果才会一目了然,可惜我没找到办法。有哪位朋友知道的话,请麻烦告诉我。还有如何向CSDN上上传视屏?
后面的内容待续。。。