[Android学UI之三]实现新浪微博消息页面左右滑动页面方式二(二)

功能:

     新浪微博消息页面

使用说明:

     毕竟android.support.v4.view 是android官方提供的包。里面有实现滑动的方式,当然也要试试了!

界面差不多,也看看图了:

左右滑动基本可以使用了!

先看代码了:

界面activity:

package com.bbswp.viewpagerdemo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Tab页面手势滑动切换以及动画效果
 */
public class MainActivity extends Activity {
    // ViewPager是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。
    // android-support-v4.jar
    private ViewPager mPager;// 页卡内容
    private List<View> listViews; // Tab页面列表
    private ImageView cursor;// 动画图片
    private TextView t1, t2, t3, t4;// 页卡头标
    private int offset = 0;// 动画图片偏移量
    private int currIndex = 0;// 当前页卡编号
    private int bmpW;// 动画图片宽度

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        InitImageView();
        InitTextView();
        InitViewPager();
    }

    /**
     * 初始化头标
     */
    private void InitTextView() {
        t1 = (TextView) findViewById(R.id.text1);
        t2 = (TextView) findViewById(R.id.text2);
        t3 = (TextView) findViewById(R.id.text3);
        t4 = (TextView) findViewById(R.id.text4);

        t1.setOnClickListener(new MyOnClickListener(0));
        t2.setOnClickListener(new MyOnClickListener(1));
        t3.setOnClickListener(new MyOnClickListener(2));
        t4.setOnClickListener(new MyOnClickListener(3));
    }

    /**
     * 初始化ViewPager
     */
    private void InitViewPager() {
        mPager = (ViewPager) findViewById(R.id.vPager);
        listViews = new ArrayList<View>();
        LayoutInflater mInflater = getLayoutInflater();
        listViews.add(mInflater.inflate(R.layout.lay1, null));
        listViews.add(mInflater.inflate(R.layout.lay2, null));
        listViews.add(mInflater.inflate(R.layout.lay3, null));
        listViews.add(mInflater.inflate(R.layout.lay4, null));
        mPager.setAdapter(new MyPagerAdapter(listViews));
        mPager.setCurrentItem(0);
        mPager.setOnPageChangeListener(new MyOnPageChangeListener());
    }

    /**
     * 初始化动画
     */
    private void InitImageView() {
        cursor = (ImageView) findViewById(R.id.cursor);
        bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)
                .getWidth();// 获取图片宽度
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int screenW = dm.widthPixels;// 获取分辨率宽度
        offset = (screenW / 4 - bmpW) / 3;// 计算偏移量
        Matrix matrix = new Matrix();
        matrix.postTranslate(offset, 0);
        cursor.setImageMatrix(matrix);// 设置动画初始位置
    }

    /**
     * ViewPager适配器
     */
    public class MyPagerAdapter extends PagerAdapter {
        public List<View> mListViews;

        public MyPagerAdapter(List<View> mListViews) {
            this.mListViews = mListViews;
        }

        @Override
        public void destroyItem(View arg0, int arg1, Object arg2) {
            ((ViewPager) arg0).removeView(mListViews.get(arg1));
        }

        @Override
        public void finishUpdate(View arg0) {
        }

        @Override
        public int getCount() {
            return mListViews.size();
        }

        @Override
        public Object instantiateItem(View arg0, int arg1) {
            ((ViewPager) arg0).addView(mListViews.get(arg1), 0);
            return mListViews.get(arg1);
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == (arg1);
        }

        @Override
        public void restoreState(Parcelable arg0, ClassLoader arg1) {
        }

        @Override
        public Parcelable saveState() {
            return null;
        }

        @Override
        public void startUpdate(View arg0) {
        }
    }

    /**
     * 头标点击监听
     */
    public class MyOnClickListener implements View.OnClickListener {
        private int index = 0;

        public MyOnClickListener(int i) {
            index = i;
        }

        @Override
        public void onClick(View v) {
            mPager.setCurrentItem(index);
        }
    };

    /**
     * 页卡切换监听
     */
    public class MyOnPageChangeListener implements OnPageChangeListener {
        /**
         * 偏移量应该要根据界面计算出来,真实开发中,不能固定了。
         * 如果你有好的方法,可以交流一起交流了!!!
         * 这里,就不考虑适应屏幕了!
         */
        int off = 45;
        int one = off;//
        int two = off * 2;
        int three = off * 3;

        @Override
        public void onPageSelected(int arg0) {
            Animation animation = null;
            switch (arg0) {
                case 0:
                    if (currIndex == 1) {
                        animation = new TranslateAnimation(one, 0, 0, 0);
                    } else if (currIndex == 2) {
                        animation = new TranslateAnimation(two, 0, 0, 0);
                    } else if (currIndex == 3) {
                        animation = new TranslateAnimation(three, 0, 0, 0);
                    }
                    break;
                case 1:
                    if (currIndex == 0) {
                        animation = new TranslateAnimation(offset, one, 0, 0);
                    } else if (currIndex == 2) {
                        animation = new TranslateAnimation(two, one, 0, 0);
                    } else if (currIndex == 3) {
                        animation = new TranslateAnimation(three, one, 0, 0);
                    }
                    break;
                case 2:
                    if (currIndex == 0) {
                        animation = new TranslateAnimation(offset, two, 0, 0);
                    } else if (currIndex == 1) {
                        animation = new TranslateAnimation(one, two, 0, 0);
                    } else if (currIndex == 3) {
                        animation = new TranslateAnimation(three, two, 0, 0);
                    }
                    break;
                case 3:
                    if (currIndex == 0) {
                        animation = new TranslateAnimation(offset, three, 0, 0);
                    } else if (currIndex == 1) {
                        animation = new TranslateAnimation(one, three, 0, 0);
                    } else if (currIndex == 2) {
                        animation = new TranslateAnimation(two, three, 0, 0);
                    }
                    break;
            }
            currIndex = arg0;
            animation.setFillAfter(true);// True:图片停在动画结束位置
            animation.setDuration(300);
            cursor.startAnimation(animation);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    }
}

界面代码比上篇博客稍微复杂点了,呵呵!!!

但要注意,是需要android.support.v4.view 包的!滑动的viewpager类是在包里的!!

接下来就是xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dip"
        android:background="@drawable/titlebar_bg_nor"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="70dip"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/text1"
                style="@style/titleIcon"
                android:background="@drawable/msg_group_at"
                 />

            <TextView
                android:id="@+id/text2"
                style="@style/titleIcon"
                android:background="@drawable/msg_group_comment"
                />

            <TextView
                android:id="@+id/text3"
                style="@style/titleIcon"
                android:background="@drawable/msg_group_message"
                 />

            <TextView
                android:id="@+id/text4"
                style="@style/titleIcon"
                android:background="@drawable/msg_group_notification"
                 />
        </LinearLayout>

        <ImageView
            android:id="@+id/cursor"
             android:layout_width="20dip"
            android:layout_height="2dip"
            android:layout_marginLeft="80dip"
            android:layout_marginBottom="3dip"
            android:background="@drawable/title_bar_mark"
            />
    </LinearLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/vPager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1.0"
        android:background="#000000"
        android:flipInterval="30"
        android:persistentDrawingCache="animation" />

</LinearLayout>

说明:本博客比较适合于界面学习,里面还有很多不完善的地方,离真实的开发,还需要一些调整的,

          希望大家能一起交流了!!!

          如果对项目中的问题,有好的方法,欢迎您能提出,让大家一起进步,谢谢!!!

     上一篇博客也是实现此界面,不过不是使用android的包,有兴趣去看看。

最后上代码:

下载地址:http://download.csdn.net/detail/hudan2714/4810054

一起学习交流,共同进步!!!     

时间: 2024-09-18 05:02:18

[Android学UI之三]实现新浪微博消息页面左右滑动页面方式二(二)的相关文章

[Android学UI之一]简单实现移动应用左右滑动导航页面

功能:     实现图片切换.首页导航. 使用原因:     使用起来非常的简单.只要一个类即可实现功能. 效果图:     有图有真相.不过例子太简单了.图也简单. 实现左右滑动. 代码:Activity package com.bbswp.viewswitcher; import com.bbswp.viewswitcher.view.HorizontalPager; import android.app.Activity; import android.os.Bundle; import

[Android学UI之二]实现网易新闻客户端左右滑动广告

功能:       左右滑动的广告 使用说明:       这次使用:android.support.v4.view 来实现左右滑动. 这次简单实现了网易广告左右滑动效果.欢迎大家一起来学习讨论!!! 先看图吧,有图有真相!!! 接下来看看代码: 界面Activity: package com.bbswp.netnews; import android.app.Activity; import android.os.Bundle; import android.os.Parcelable; im

[Android学UI之四]实现分断Button,模仿MIUI设置页面顶部Button

功能:     拼接的Button. 使用说明:     用RidaoGroup包裹几个RidaoButton,实现拼接. 还是看图,更真实!!! 页面做的比较简单,这个功能也不太难..这只是其中的实现方式之一.有其它更好的方式,请告之. 下面还是看代码吧: 界面Activity: package com.bbswp.topbuttondemo; import com.bbswp.topbuttondemo.view.SegmentedRadioGroup; import android.app

Android更新UI的四种方法详解_Android

前言 相信每位Android开发者们都知道更新UI只能在主线程中进行,若是在子线程执行任务后需要更新UI,则需要借助handler跳转到主线程中.以下介绍几种操作UI的方法. 一.使用Handler的handleMessage() Handler的构造 public Handler() { this(null, false); } public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { fina

网络-android 多个activity响应同一个消息

问题描述 android 多个activity响应同一个消息 我在写一个关于接收网络数据,接受数据后如何用一个消息来通知UI层.求大神给正解 解决方案 用广播不行吗 如果回答对您有帮助,请采纳 解决方案二: 几种通信方式都在下面网址内了http://segmentfault.com/blog/xiaocao/1190000002400391 解决方案三: 除非有特殊情况,尽量不要用intent来通知网络完成的事情,而是使用UI线程的Handler来发消息给UI. 解决方案四: 写个基类继承,然后

Android自定义UI实现微信语音_Android

本文实例为大家分享了java获取不同路径的方法,供大家参考,具体内容如下 思路: 自定义Button 获取DialogManager.AudioManager setOnLongClickListener长按事件--做好AudioManager的录音准备工作 AudioManager.setOnAudioStateListener(this)实现录音准备完毕的接口回调方法,方法中去发送MSG_AUDIO_PREPARE消息代表录音准备工作完毕 在mHandler中接收消息,开始开启线程录音,并且

android更新UI的几种方法

作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了, 因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现, 自己越来越消极怠工,只是在无意义的敲代码,敲的还是网上抄来的代码,如果不行,继续找. 这就 是项目进度没有规划好而导致的. 最近在做有关蓝牙的项目,一开始的进度都安排得很顺利,但是因 为测试需要两部手机,而且还要是android手机,暑假已经开始了,同学们都回家了,加上我手机的蓝牙坏了 ,导致我的进度严重

细说UI线程和Windows消息队列

在Windows应用程序中,窗体是由一种称为"UI线程(User Interface Thread)"的特殊类型的线程创建的. 首先,UI线程是一种"线程",所以它具有一个线程应该具有的所有特征,比如有一个线程函数和一个线程ID. 其次,"UI线程"又是"特殊"的,这是因为UI线程的线程函数中会创建一种特殊的对象--窗体,同时,还一并负责创建窗体上的各种控件. 窗体和控件大家都很熟悉了,这些对象具有接收用户操作的功能,它们是用

Android手机UI设计分辨率基础知识

1.术语和概念 Android手机ui设计分辨率基础知识 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 Aspect Ratio(宽高比率) 指的是实际的物理尺寸宽高比率,分为long和nolong Milestone是16:9,属于long Resolution(分辨率) 和电脑的分辨率概念一样,指手机屏幕纵.横方向像素个数 Milestone是854*480 DPI(dot