zoukankan      html  css  js  c++  java
  • 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上上传视屏?

    后面的内容待续。。。

  • 相关阅读:
    JAVA中堆和栈的区别
    怎么回答面试官:你对Spring的理解?
    如何设计一个高可用、高并发秒杀系统
    这应该是把Java内存区域讲的最清楚的一篇文章
    Spring Cloud底层原理解析
    Spring事务管理详解
    选择合适Redis数据结构,减少80%的内存占用
    最强Java并发编程详解:知识点梳理,BAT面试题等
    深入理解HashMap
    Springboot 优雅停止服务的几种方法
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2978355.html
Copyright © 2011-2022 走看看