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

   参考自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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利益相关者软件工程_改善开发人员团队与非技术利益相关者之间交流的方法

利益相关者软件工程Whether you’re working on a startup or a big company, keeping your stakeholders and non-technical partners engaged and up to date on what the tech team has been building can be hard.无论您是在初创公司还是大公司中工作&#xff0c;都要让您的…

Hibernate的检索策略

Hibernate的Session在加载一个Java对象时&#xff0c;可以将与这个对象相关联的其他Java对象都加载到缓存中&#xff0c;以便程序及时调用。但有些情况下&#xff0c;我们不需要加载太多无用的对象到缓存中&#xff0c;一来这样会撑爆内存&#xff0c;二来增加了访问数据库的次…

响应式网格项目动画布局_响应式网格及其实际使用方式:常见的UI布局

响应式网格项目动画布局重点 (Top highlight)第二部分 (Part II) Now that you have a basic understanding of how to use grids, you might be wondering how to apply them to layouts you see on the web. Responsive grids are a method to systematically align your des…

SQL函数大全

SQL函数大全 --聚合函数use pubsgoselect avg(distinct price) --算平均数from titleswhere typebusinessgo use pubsgoselect max(ytd_sales) --最大数from titlesgo use pubsgoselect min(ytd_sales) --最小数from titlesgo use pubsgoselect type,sum(price),sum(advanc…

时间轴ui设计_我应该在UI设计上花更多时间吗?

时间轴ui设计Let’s start with an example of communication skills: they are important for any profession, and you expect any professional to have a decent level. However, excellent communication skills won’t make up for the lack of core expertise. Imagine …

一、Oracle介绍

Oracle学习笔记 一、 Oracle介绍 选择数据库的标准 项目的规模 负载量多大&#xff0c;用户量多少 成本 安全性 Oracle 认证 初级&#xff1a;OCA&#xff1a;Oracle Certificated Associate 中级&#xff1a;OCP&#xff1a;Oracle Certificated Professional 高级&#xff…

移动端分步注册_移动应用程序的可用性测试:分步指南

移动端分步注册Written by Justin Mifsud由贾斯汀米夫苏德 ( Justin Mifsud)撰写 The mobile market is huge and growing at a very fast rate. With an estimated 4.5 billion subscribers worldwide, it is forecasted that the number of mobile phones will surpass the …

ldd随笔(1)-linux设备模型

一下只是个人学习后的理解&#xff0c;可能有很多不对的地方。 要学习linux的设备驱动模型&#xff0c;首先必须要知道kobject和kset的概念&#xff0c;下面是kobject在2.6.38的源码中的实现。 struct kobject {const char *name; //名称&#xff0c;可能在sysfs中创…

插图 引用 同一行两个插图_提出食物主题中的插图

插图 引用 同一行两个插图I have a page in my portfolio, which is about search functionality. I wanted that page to feel fun and engaging, to convey a positive vibe, so I decided to add illustrations to it.我的投资组合中有一个页面与搜索功能有关。 我希望该页面…

Hadoop的SequenceFile读写实例

1 SequenceFile可以处理hdfs上大量小文件&#xff0c;它可以作为大量小文件的容器。HDFS和MapReduce是针对大文件优化的&#xff0c;所以通过SequenceFile类型将小文件包装起来可以获得更高效的存储和处理。存储2 在SequenceFile中的键和值并不一定是Writable类型&#xff…

脸部细微表情识别_您可以仅使用面部表情来控制字体吗?

脸部细微表情识别原型 (The prototype) Facetype is the name of Adam’s interactive project, in which the emotions detected from a person’s facial gestures control a variable font. To each detected emotion corresponds a specific typeface, which keeps transfo…

ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机

使用下例中ssky-keygen和ssh-copy-id&#xff0c;仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机。 ssh-keygen 创建公钥和密钥。 ssh-copy-id 把本地主机的公钥复制到远程主机的authorized_keys文件上。ssh-copy-id 也会给远程主机的用户主目录&#xff08;ho…

uva10891Game of sum

题意:经典的取石子游戏是这样的:有一堆石子&#xff0c;A、B两个人轮流取&#xff0c;每次取一颗&#xff0c;只能从边上取&#xff0c;每个石子有相应的价值&#xff0c;A、B两人都想使得自己的价值最多&#xff0c;两个人足够聪明&#xff0c;问最后价值分别是多少 本题则是可…

用户体验设计师能为seo做_用户体验设计师可以从产品设计历史中学到什么

用户体验设计师能为seo做Many things have changed from tool design in the prehistoric era to today’s digital product design. However, we can see surprisingly many similarities. Especially when it comes down to one particular aspect: usability.从史前时代的工…

函数指针

顾名思义&#xff0c;指针函数即返回指针的函数。其一般定义形式如下&#xff1a; 类型名 *函数名(函数参数表列); 其中&#xff0c;后缀运算符括号“()”表示这是一个函数&#xff0c;其前缀运算符星号“*”表示此函数为指针型函数&#xff0c;其函数值为指针&#xff0c;即它…

orton效果_如何使图片发光:Orton效果

orton效果Have you ever seen an impossibly dream-like landscape photo? One with a slow burning, glowing sunset. That’s really the best way to describe it, the image looks as if it’s glowing. You might be thinking, “wow, I wish I was that good and could …

UVA10785 The Mad Numerologist

虽然是sorting的压轴&#xff0c;但是比起前面真心水题。这个专题结合前面string的很多&#xff0c;排序相对简单了&#xff0c;qsort基本解决。 题目&#xff1a; The Mad Numerologist Numerology is a science that is used by many people to find out a mans personality,…

苹果人机交互指南_苹果人机界面设计指南的10个见解

苹果人机交互指南重点 (Top highlight)I’ve been developing an IOS app for the past few months and have been constantly referring to Apple’s Human Interface Design Guidelines. I would consider it a must-read for any aspiring or current UI/UX designer.在过去…

也来学学插件式开发

上一家公司有用到插件式开发来做一个工具箱&#xff0c;类似于QQ电脑管家&#xff0c;有很多工具列表&#xff0c;点一下工具下载后就可以开始使用了。可惜在那家公司待的时候有点短&#xff0c;没有好好研究一下。现在有空&#xff0c;自己在网上找了些资料&#xff0c;也来试…

同态加法_我对同态的想法

同态加法Early February, I uploaded this shot onto Dribbble. Nothing fancy –– just two screens experimenting with “2月初&#xff0c;我将这张照片上传到Dribbble。 没什么幻想–只有两个屏幕在尝试“ Neumorphism,” or soft UI. Little did I know that this post…