在工作中又很多需求都不是android系统自带的控件可以达到效果的,内置的TabHost就是,只能达到简单的效果 ,所以这个时候就要自定义控件来达到效果:这个效果就是: 使用自定义RadioButton和ViewPager实现TabHost带滑动的页卡效果。

               以下是实现步骤:

1、准备自定义RadioButton控件的样式图片等,就是准备配置文件:

                                                  (1)、  在项目的values文件夹里面创建 attrs.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyRadioButton">
        <attr name="pic" format="reference" />
    </declare-styleable>
</resources>

                                                (2)、创建 styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="radioButtonStyle">
        <item name="android:button">@null</item>
        <item name="android:textSize">12dip</item>
        <item name="android:gravity">center_horizontal|bottom</item>
        <item name="android:paddingBottom">5dip</item>
    </style>

</resources>
                                 
                                             (3)、把中文定义在string.xml里:

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="hello">Hello World, MainAct!</string>
        <string name="app_name">TabHost</string>
        <string name="home">大厅</string>
        <string name="account">用户</string>
        <string name="beanExchange">玩具</string>
        <string name="winAcciche">公告</string>
        <string name="more">更多</string>

</resources>

                                              (4)、    创建MyRadioButton类继承RadioButton:

package com.dome.viewer.widget;

import com.dome.viewer.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
import android.widget.RadioButton;

public class MyRadioButton extends RadioButton {

private Drawable drawable;

public MyRadioButton(Context context, AttributeSet attrs) {
                super(context, attrs);
                TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyRadioButton);
                drawable = a.getDrawable(R.styleable.MyRadioButton_pic);
        }
        //Drawable转换成Bitmap
        private Bitmap drawable2Bitmap(Drawable drawable) {
                if (drawable instanceof BitmapDrawable) {
                        return ((BitmapDrawable) drawable).getBitmap();
                } else if (drawable instanceof NinePatchDrawable) {
                        Bitmap bitmap = Bitmap
                                        .createBitmap(
                                                        drawable.getIntrinsicWidth(),
                                                        drawable.getIntrinsicHeight(),
                                                        drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                                                        : Bitmap.Config.RGB_565);
                        Canvas canvas = new Canvas(bitmap);
                        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                        drawable.draw(canvas);
                        return bitmap;
                } else {
                        return null;
                }
        }

@Override
        protected void onDraw(Canvas canvas) {
                super.onDraw(canvas);
                Bitmap image = drawable2Bitmap(drawable);
                if (image != null) {
                        Paint pt = new Paint();
                        pt.setARGB(255, 66, 66, 66);
                        // 消除锯齿
                        pt.setAntiAlias(true);
                        // 居中显示图片
                        int imageX = (int) (this.getWidth() - image.getWidth()) / 2;
                        canvas.drawBitmap(image, imageX, 2, pt);
                        pt.setARGB(255, 255, 255, 255);
                }
        }
}
                                                  (5)、为Activity准备布局文件,命名为:tabhost.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:attrstest="http://schemas.android.com/apk/res/com.dome.viewer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg" >

<RelativeLayout
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="50dip"
        android:background="@drawable/bg_navigation" >

<TextView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_centerVertical="true"
            android:layout_marginLeft="5dip"
            android:gravity="center"
            android:text="首页"
            android:textSize="25dip" />
    </RelativeLayout>

<android.support.v4.view.ViewPager
        android:id="@+id/vPager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:paddingBottom="55dip"
        android:persistentDrawingCache="animation" />

<RadioGroup
        android:id="@+id/rg_main_btns"
        android:layout_width="fill_parent"
        android:layout_height="50dip"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom"
        android:background="@drawable/bg_navigation"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >

<com.dome.viewer.widget.MyRadioButton
            android:id="@+id/buyHomeTab"
            style="@style/radioButtonStyle"
            android:layout_width="60dip"
            android:layout_height="50dip"
            android:background="@drawable/navigation_item"
            android:checked="true"
            attrstest:pic="@drawable/gcdt"
            android:text="@string/home" />

<com.dome.viewer.widget.MyRadioButton
            android:id="@+id/winAfficheTab"
            style="@style/radioButtonStyle"
            android:layout_width="60dip"
            android:layout_height="50dip"
            android:background="@drawable/navigation_item"
            android:button="@null"
            attrstest:pic="@drawable/kjgg"
            android:text="@string/winAcciche" />

<com.dome.viewer.widget.MyRadioButton
            android:id="@+id/integralTab"
            style="@style/radioButtonStyle"
            android:layout_width="65dip"
            android:layout_height="50dip"
            android:background="@drawable/navigation_item"
            attrstest:pic="@drawable/jfdh"
            android:text="@string/beanExchange" />

<com.dome.viewer.widget.MyRadioButton
            android:id="@+id/accountTab"
            style="@style/radioButtonStyle"
            android:layout_width="60dip"
            android:layout_height="50dip"
            android:background="@drawable/navigation_item"
            attrstest:pic="@drawable/yhzx"
            android:text="@string/account" />

<com.dome.viewer.widget.MyRadioButton
            android:id="@+id/moreTab"
            style="@style/radioButtonStyle"
            android:layout_width="60dip"
            android:layout_height="50dip"
            android:background="@drawable/navigation_item"
            attrstest:pic="@drawable/more"
            android:text="@string/more" />
    </RadioGroup>

</RelativeLayout>

                                           (6)、创建TabHostActivity:

package com.dome.viewer;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
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.Log;
import android.view.View;
import android.view.Window;
import android.widget.RadioGroup;

public class TabHostActivity extends Activity {
   
        
        @Override
        protected void onStart() {
                super.onStart();
        }

private RadioGroup radioGroup;
        
        // 页卡内容
        private ViewPager mPager;
        // Tab页面列表
        private List<View> listViews;
        // 当前页卡编号
        private LocalActivityManager manager = null;
        
        private MyPagerAdapter mpAdapter = null;
        private int index;
        
        // 更新intent传过来的值
        @Override
        protected void onNewIntent(Intent intent) {
                setIntent(intent);
        }
        
        @Override
        protected void onSaveInstanceState(Bundle outState) {
           
        }
        @Override
        public void onBackPressed() {
                Log.i("","onBackPressed()");
                super.onBackPressed();
        }
        @Override
        protected void onPause() {
                Log.i("","onPause()");
                super.onPause();
        }
        
        @Override
        protected void onStop() {
                Log.i("","onStop()");
                super.onStop();
        }

@Override
        protected void onDestroy() {
                Log.i("","onDestroy()");
                super.onDestroy();
        }
        
        
        @Override
        protected void onResume() {
                super.onResume();
               
                if(getIntent() != null){
                        index = getIntent().getIntExtra("index", 0);
                        mPager.setCurrentItem(index);
                        setIntent(null);
                }else{
                        if(index < 4){
                                index = index+1;
                                mPager.setCurrentItem(index);
                                index = index -1;
                                mPager.setCurrentItem(index);
                                
                        }else if(index == 4){
                                index= index-1;
                                mPager.setCurrentItem(index);
                                index = index +1;
                                mPager.setCurrentItem(index);
                        }
                }
        }
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                requestWindowFeature(Window.FEATURE_NO_TITLE);
                setContentView(R.layout.tabhost);
                mPager = (ViewPager) findViewById(R.id.vPager);
                manager = new LocalActivityManager(this, true);
                manager.dispatchCreate(savedInstanceState);
                InitViewPager();
                radioGroup = (RadioGroup) this.findViewById(R.id.rg_main_btns);
                radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                                        public void onCheckedChanged(RadioGroup group, int checkedId) {
                                                switch (checkedId) {
                                                
                                                case R.id.buyHomeTab:
                                                        index = 0;
                                                        listViews.set(0,
getView("A", new Intent(TabHostActivity.this, OneDomeActivity.class)));
                                                        mpAdapter.notifyDataSetChanged();
                                                        mPager.setCurrentItem(0);
                                                        break;
                                                        
                                                case R.id.winAfficheTab:
                                                        index = 1;
                                                        listViews.set(1,
getView("B", new Intent(TabHostActivity.this, TowDomeActivity.class)));
                                                        mpAdapter.notifyDataSetChanged();
                                                        mPager.setCurrentItem(1);
                                                        break;
                                                        
                                                case R.id.integralTab:
                                                        index = 2;
                                                        listViews.set(2,
getView("C", new Intent(TabHostActivity.this,
ThreeDomeActivity.class)));
                                                        mpAdapter.notifyDataSetChanged();
                                                        mPager.setCurrentItem(2);
                                                        break;
                                                        
                                                case R.id.accountTab:
                                                        index = 3;
                                                        listViews.set(3,
getView("D", new Intent(TabHostActivity.this,
FourDomeActivity.class)));
                                                        mpAdapter.notifyDataSetChanged();
                                                        mPager.setCurrentItem(3);
                                                        break;
                                                        
                                                case R.id.moreTab:
                                                        index = 4;
                                                        listViews.set(4,
getView("E", new Intent(TabHostActivity.this,
FiveDomeActivity.class)));
                                                        mpAdapter.notifyDataSetChanged();
                                                        mPager.setCurrentItem(4);
                                                        break;
                                                default:
                                                        break;
                                                }
                                        }
                                });
        }
        
        /**
         * 初始化ViewPager
         */
        private void InitViewPager() {
                Intent intent = null;
                listViews = new ArrayList<View>();
                mpAdapter = new MyPagerAdapter(listViews);
                intent = new Intent(TabHostActivity.this, OneDomeActivity.class);
                listViews.add(getView("A", intent));
                intent = new Intent(TabHostActivity.this, TowDomeActivity.class);
                listViews.add(getView("B", intent));
                intent = new Intent(TabHostActivity.this, ThreeDomeActivity.class);
                listViews.add(getView("C", intent));
                intent = new Intent(TabHostActivity.this, FourDomeActivity.class);
                listViews.add(getView("D", intent));
                intent = new Intent(TabHostActivity.this, FiveDomeActivity.class);
                listViews.add(getView("E", intent));
                mPager.setOffscreenPageLimit(0);
                mPager.setAdapter(mpAdapter);
                mPager.setCurrentItem(0);
                mPager.setOnPageChangeListener(new MyOnPageChangeListener());
        }

/**
         * 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) {
                }
        }

/**
         * 页卡切换监听,ViewPager改变同样改变TabHost内容
         */
        public class MyOnPageChangeListener implements OnPageChangeListener {

public void onPageSelected(int arg0) {
                        manager.dispatchResume();
                        switch (arg0) {
                        case 0:
                                index = 0;
                                radioGroup.check(R.id.buyHomeTab);
                                listViews.set(0, getView("A", new Intent(TabHostActivity.this, OneDomeActivity.class)));
                                mpAdapter.notifyDataSetChanged();
                                break;
                        case 1:
                                index = 1;
                                radioGroup.check(R.id.winAfficheTab);
                                listViews.set(1, getView("B", new Intent(TabHostActivity.this, TowDomeActivity.class)));
                                mpAdapter.notifyDataSetChanged();
                                break;
                        case 2:
                                index = 2;
                                radioGroup.check(R.id.integralTab);
                                listViews.set(2, getView("C", new Intent(TabHostActivity.this, ThreeDomeActivity.class)));
                                mpAdapter.notifyDataSetChanged();
                                break;
                        case 3:
                                index = 3;
                                radioGroup.check(R.id.accountTab);
                                listViews.set(3, getView("D", new Intent(TabHostActivity.this, FourDomeActivity.class)));
                                mpAdapter.notifyDataSetChanged();
                                break;
                        case 4:
                                index = 4;
                                radioGroup.check(R.id.moreTab);
                                listViews.set(4, getView("E", new Intent(TabHostActivity.this, FiveDomeActivity.class)));
                                mpAdapter.notifyDataSetChanged();
                                break;
                        }
                }
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                }
                public void onPageScrollStateChanged(int arg0) {
                }
        }

private View getView(String id, Intent intent) {
                return manager.startActivity(id, intent).getDecorView();
        }
        
}

                       (7)、然后依次创建5个Activity作为页卡,和创建5个xml作为Activity的布局文件,如图:

 
demo下载地址: http://www.apkbus.com/forum.php?mod=attachment&aid=NDUzOTR8MGM4ZmQ1NGV8MTM3NjUzMDkxMXw3MDg2Mnw4NjEyNQ%3D%3D

使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果的更多相关文章

  1. 【Android进阶】使用Andbase快速开发框架实现常见侧滑栏和滑动标签页组合效果

    最近闲来无事,在网上寻找源代码看,突然发现了一个国内技术牛人开发的快速开发框架Andbase,花了一天时间研究了下源码和怎么使用,现将开发常见的侧滑栏和滑动标签页组合效果的使用介绍个大家,希望可以减少 ...

  2. ViewPager和Tabhost结合,可滑动的tabhost

    public class ViewPagerActivity extends Activity { List<View> listViews; Context context = null ...

  3. Android——ViewPager多页面滑动切换以及动画效果

    一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式,白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了, ...

  4. 【解决ViewPager在大屏上滑动不流畅】 设置ViewPager滑动翻页距离

    在项目中做了一个ViewPager+Fragment滑动翻页的效果,在模拟器和小米手机上测试也比较正常.但是换到4.7以上屏幕测试的时候发现老是滑动失效. 因为系统默认的滑动策略是当用户滑动超过半屏之 ...

  5. 桌面浏览器实现滑动翻页效果(Swiper)

    还是那个号称很炫的B/S展示软件,在液晶屏上展示需要有滑动翻页的效果(在同一页面滑动切换内容,不是切换页面),最后确定使用功能很强大的Swiper类库. 具体优点可参考:http://www.chin ...

  6. Android 自定义RadioButton实现

    由于使用小米系统MIUI运行是RadioButton样式跟google Android API自定义的不一样,则我们可以定义任何想要的东东.没有做不到,只有想不到 Android 自定义RadioBu ...

  7. Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡

     <Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡> 之前基于github上的第三方开源控件ViewPagerIndicator的UnderlinePa ...

  8. Android使用ViewPager实现左右循环滑动及轮播效果

    边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其 ...

  9. 转:Android ViewPager多页面滑动切换以及动画效果

    一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式, 白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了 ...

随机推荐

  1. http协议基础(六)报文首部

    http请求和响应报文内容比较多,会分为大概四部分更新,最近比较忙,没太多时间整理- - 首先来看看报文结构吧 1.http请求报文 http请求报文由方法.URI.http版本.http首部字段等构 ...

  2. MYSQL主从不同步延迟原理分析及解决方案(摘自http://www.jb51.net/article/41545.htm)

    1. MySQL数据库主从同步延迟原理.要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主 库对所有DDL和DML产生binlog,binlog是顺序写,所 ...

  3. XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)

    以下是代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  4. mybatis例子

    mybatis的mapper不允许重载,因为它需要通过方法名称[不加签名]去查找需要执行的sql 1.批量删除 <delete id="deletePlanLocations" ...

  5. lnmp之php5.6.29安装

    linux下lnmp环境之php安装 为了防止出现缺失,安装下面集成,复制的时候请将这个复制成一个整行,下面3行是一整行 [root@localhost src]# yum -y install gc ...

  6. Linux root用户下强制静音的问题

    解决方法 pulseaudio --start --log-target=syslog suorce /etc/profile

  7. Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?

    Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?先上两种实现方式的实例:$querys["house_type_image"] ...

  8. nohup 命令(设置后台进程): appending output to ‘nohup.out’ 问题

    一.Linux 下使用 nohup Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行. 比如我们要运行weblogic在后台:./startW ...

  9. appium自动化测试实战

    一.Appium的介绍   Appium是一款开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用. 1. 使用appium进行自动化测试的好处 Appium在不同平台 ...

  10. Python中模块(Module)和包(Package)的区别

    本文绝大部分内容转载至:廖雪峰官方网站 1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...