使用自定义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
使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。相关推荐
- windows phone水平滑动翻页动画效果
转自:http://www.cnblogs.com/poorpan/archive/2012/04/23/2466413.html 大家看windows phone上的应用,很多都用到了这种效果 ,想 ...
- android quot;动画重叠quot;,自定义ViewPager实现仿 quot;多邻国quot; 的闪卡效果
如果你使用过 Duolingo (多邻国免费学习英语), 那你很有可能看到过下面这种界面效果: 看起来相当的酷对不对? 鉴于效果不错并且使用场景很多,因此我决定开始仿照它做一个类似的 Sample 首 ...
- ViewPager过半(1/2)滑动翻页,超过1/2滑动下页
公司需求要求必须手动触摸滑动超过1/2的时候松开可以滑动下一页,没有超过1/2返回原页,首先肯定是重写viewpager,但是发现效果比较卡顿,只能从源码下手 经过分析,源码滑动的逻辑处理在此处,tr ...
- 在PHP当中制作隔行换色的效果以及制作上下翻页的效果!
首先说明隔行换色的效果,需要用到tr:nth_child(odd);或者括号里的值是even,odd是从第一行开始隔一行,even是从第二行开始: 具体代码如下图案所示: 1 <style> ...
- css怎么设置图片卷角效果,CSS3 带分隔线卷角贴纸效果
CSS 语言: CSSSCSS 确定 body { padding-top: 2.5em; background-color: #666; color: #333; font-size: 84%; f ...
- 微信小程序(实现抖音播放效果)上下滑动全屏播放效果
最近项目要做一个类似于抖音的一个视频播放 需要小程序完成 在再次确定了需要这个需求的情况下就开始了(其实因为不是说这个功能不好做主要是但心做出来肯定不流畅 卡顿什么的 优化不好优化然后费了好大的劲优化 ...
- 写出小说滑动翻页的效果
小说翻页 小说 翻页的功能 代码 小说 我们的生活已经离不开手机了,手机支付,手机导航,娱乐,获取新闻动态,与人沟通联系,工作生活都与手机息息相关.这是最好的时代,这也是最坏的时代.在压力环绕着我们的 ...
- ViewPager和Fragment实现滑动标签页步骤以及方法总结
要实现左右滑动的标签页其实有很多种办法,比如最外层一个FrameLayout,里面重叠几个View监听滑动事件来控制具体的展示效果以及相应的处理,还有其他很多种方式,但是呢各个方法的运行效率以及编码速 ...
- android切换页面上滑动动画,Android ViewPager多页面滑动切换以及动画效果
评论 #28楼[楼主] 2012-06-01 14:27D.Winter @孤寒江雪 我猜 要么在头尾各再加入一个页卡 在页卡切换监听中判断,如果选中了头尾的页卡,就返回到相邻的那个页卡.头尾页卡的界 ...
最新文章
- NPTL简介 (NATIVE POSIX Thread Library)
- C语言解力扣461.汉明距离
- Css3中的响应式布局的应用
- 理解Fragment生命周期(一)
- “混合云产业推进联盟”成立,ZStack实力助推
- dtm文件生成等高线 lisp_CAD2000下DTM的建立
- phpnow mysql_使用PHPnow搭建本地PHP环境+创建MySQL数据库
- 将活跃天数转化为等级,输入等级查询活跃天数
- djay Pro 2 Mac(DJ混音软件) v2.0.11激活版
- tsp问题——遗传算法解决
- 卫生洁具安装工艺标准
- 蓝牙耳机哪个品牌最好?数码博主整理2023超高性价比蓝牙耳机推荐
- sftp命令上传本地文件到服务器,使用sftp命令上传文件夹方法
- 【20180615】【射频通信】RF、IF、Baseband的区别,PLL和VCO的定义,I/Q信号的定义
- SEO到底是什么,如何理解引擎搜索?
- 系统升级: PHP(5.1.6-5.4.7) CI(1.7.2-2.1.2)调查记录
- Spring @Configuration和@Component的区别(enhancer的原因)
- 富文本编辑器 禁止改变文本内容
- 基于Apache Hudi构建智能湖仓实践(附亚马逊工程师代码)
- Java中将base64编码字符串转换为图片