参考自http://www.apkbus.com/android-86125-1-1.html

这篇文章技术含量一般,大家别见笑。源码我以测试,在底部可下载。    好了先上效果图:

以下是实现步骤:

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的布局文件,如图:  

 欢迎关注http://e.weibo.com/2975543812

源码下载:http://files.cnblogs.com/feifei1010/TabHostDome.rar 

转载于:https://www.cnblogs.com/crazywenza/archive/2013/01/23/2873362.html

使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。相关推荐

  1. windows phone水平滑动翻页动画效果

    转自:http://www.cnblogs.com/poorpan/archive/2012/04/23/2466413.html 大家看windows phone上的应用,很多都用到了这种效果 ,想 ...

  2. android quot;动画重叠quot;,自定义ViewPager实现仿 quot;多邻国quot; 的闪卡效果

    如果你使用过 Duolingo (多邻国免费学习英语), 那你很有可能看到过下面这种界面效果: 看起来相当的酷对不对? 鉴于效果不错并且使用场景很多,因此我决定开始仿照它做一个类似的 Sample 首 ...

  3. ViewPager过半(1/2)滑动翻页,超过1/2滑动下页

    公司需求要求必须手动触摸滑动超过1/2的时候松开可以滑动下一页,没有超过1/2返回原页,首先肯定是重写viewpager,但是发现效果比较卡顿,只能从源码下手 经过分析,源码滑动的逻辑处理在此处,tr ...

  4. 在PHP当中制作隔行换色的效果以及制作上下翻页的效果!

    首先说明隔行换色的效果,需要用到tr:nth_child(odd);或者括号里的值是even,odd是从第一行开始隔一行,even是从第二行开始: 具体代码如下图案所示: 1 <style> ...

  5. css怎么设置图片卷角效果,CSS3 带分隔线卷角贴纸效果

    CSS 语言: CSSSCSS 确定 body { padding-top: 2.5em; background-color: #666; color: #333; font-size: 84%; f ...

  6. 微信小程序(实现抖音播放效果)上下滑动全屏播放效果

    最近项目要做一个类似于抖音的一个视频播放 需要小程序完成 在再次确定了需要这个需求的情况下就开始了(其实因为不是说这个功能不好做主要是但心做出来肯定不流畅 卡顿什么的 优化不好优化然后费了好大的劲优化 ...

  7. 写出小说滑动翻页的效果

    小说翻页 小说 翻页的功能 代码 小说 我们的生活已经离不开手机了,手机支付,手机导航,娱乐,获取新闻动态,与人沟通联系,工作生活都与手机息息相关.这是最好的时代,这也是最坏的时代.在压力环绕着我们的 ...

  8. ViewPager和Fragment实现滑动标签页步骤以及方法总结

    要实现左右滑动的标签页其实有很多种办法,比如最外层一个FrameLayout,里面重叠几个View监听滑动事件来控制具体的展示效果以及相应的处理,还有其他很多种方式,但是呢各个方法的运行效率以及编码速 ...

  9. android切换页面上滑动动画,Android ViewPager多页面滑动切换以及动画效果

    评论 #28楼[楼主] 2012-06-01 14:27D.Winter @孤寒江雪 我猜 要么在头尾各再加入一个页卡 在页卡切换监听中判断,如果选中了头尾的页卡,就返回到相邻的那个页卡.头尾页卡的界 ...

最新文章

  1. NPTL简介 (NATIVE POSIX Thread Library)
  2. C语言解力扣461.汉明距离
  3. Css3中的响应式布局的应用
  4. 理解Fragment生命周期(一)
  5. “混合云产业推进联盟”成立,ZStack实力助推
  6. dtm文件生成等高线 lisp_CAD2000下DTM的建立
  7. phpnow mysql_使用PHPnow搭建本地PHP环境+创建MySQL数据库
  8. 将活跃天数转化为等级,输入等级查询活跃天数
  9. djay Pro 2 Mac(DJ混音软件) v2.0.11激活版
  10. tsp问题——遗传算法解决
  11. 卫生洁具安装工艺标准
  12. 蓝牙耳机哪个品牌最好?数码博主整理2023超高性价比蓝牙耳机推荐
  13. sftp命令上传本地文件到服务器,使用sftp命令上传文件夹方法
  14. 【20180615】【射频通信】RF、IF、Baseband的区别,PLL和VCO的定义,I/Q信号的定义
  15. SEO到底是什么,如何理解引擎搜索?
  16. 系统升级: PHP(5.1.6-5.4.7) CI(1.7.2-2.1.2)调查记录
  17. Spring @Configuration和@Component的区别(enhancer的原因)
  18. 富文本编辑器 禁止改变文本内容
  19. 基于Apache Hudi构建智能湖仓实践(附亚马逊工程师代码)
  20. Java中将base64编码字符串转换为图片

热门文章

  1. jquery --- 监听input框失效
  2. SUSE团队已将重心偏向GCC 7
  3. JAXB vs XStream
  4. Linux磁盘的划分
  5. 化零为整WCF(14) - 事务(Transaction)
  6. IBM如何拥抱Spark
  7. jquery.ui.draggable中文文档jquery 自由拖拽类~study~
  8. POJ-1556 The Doors 线段相交+最短路
  9. 26个提升java性能需要注意的地方
  10. Linux软件安装解决方案