- 浏览: 972172 次
- 性别:
- 来自: 山西
文章分类
最新评论
-
白小默:
你好 可以提供下源码DEMO吗,不知为何,我导出来的excel ...
jxls 使用模板文件导出生成excel -
zkzqzzz:
博主威武!
让微信二维码扫描您的APK -
zkzqzzz:
感谢博主 原来那些类都不是必须的 或者自己写!!博主真棒 ...
抢红包插件实现原理浅析 -
zkzqzzz:
博主 请问你的其他类在哪里呢?
抢红包插件实现原理浅析 -
zkzqzzz:
其他类在哪呢?
抢红包插件实现原理浅析
首先说明的是,我们做APP开发,Tab分页不管是顶部还是底部,都是必不可少的,网上也有太多太多的实现方式了,我在这里总结一下:
第一种方式: TabHost原始方式:(链接另一篇文章)
这里实现的是底部菜单:
布局文件:(我们通过RelativeLayout 可以把TabWidget定位在底部)
- <?xml version="1.0" encoding="utf-8"?>
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- android:padding="3dp" >
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_weight="1" >
- </FrameLayout>
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignBottom="@android:id/tabcontent"
- android:background="@drawable/tabbar_bg" />
- </RelativeLayout>
- </TabHost>
<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:padding="3dp" > <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" > </FrameLayout> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignBottom="@android:id/tabcontent" android:background="@drawable/tabbar_bg" /> </RelativeLayout> </TabHost>
在这里我们将说明一下:之前我是获取到TabWidget的view试图及内部icon和title,然后控制实现其效果,但是我们也可以用另外一种方式,也就是我们调用TabHost.TabSpec 的setIndicator(View view);这个方法,我们可以定制显示的view,
代码片段:
- /***
- * 创建footerview
- */
- public void createFooterView() {
- tabHost = getTabHost(); // The activity TabHost
- view = new TabView(this, R.drawable.tabbar_icon_home,
- R.drawable.tabbar_icon_home_selecotr);
- view.setBackgroundDrawable(this.getResources().getDrawable(
- R.drawable.footer_view_selector));
- intent = new Intent(MainActivity.this, HomeActivity.class);
- spec = tabHost.newTabSpec("num1").setIndicator(view).setContent(intent);
- tabHost.addTab(spec);
- view = new TabView(this, R.drawable.tabbar_icon_search,
- R.drawable.tabbar_icon_search_selecotr);
- view.setBackgroundDrawable(this.getResources().getDrawable(
- R.drawable.footer_view_selector));
- intent = new Intent(MainActivity.this, HomeActivity.class);
- spec = tabHost.newTabSpec("num2").setIndicator(view).setContent(intent);
- tabHost.addTab(spec);
- view = new TabView(this, R.drawable.tabbar_icon_cart,
- R.drawable.tabbar_icon_cart_selector);
- view.setBackgroundDrawable(this.getResources().getDrawable(
- R.drawable.footer_view_selector));
- intent = new Intent(MainActivity.this, HomeActivity.class);
- spec = tabHost.newTabSpec("num3").setIndicator(view).setContent(intent);
- tabHost.addTab(spec);
- view = new TabView(this, R.drawable.tabbar_icon_more,
- R.drawable.tabbar_icon_more_selecotr);
- view.setBackgroundDrawable(this.getResources().getDrawable(
- R.drawable.footer_view_selector));
- intent = new Intent(MainActivity.this, HomeActivity.class);
- spec = tabHost.newTabSpec("num4").setIndicator(view).setContent(intent);
- tabHost.addTab(spec);
- }
/*** * 创建footerview */ public void createFooterView() { tabHost = getTabHost(); // The activity TabHost view = new TabView(this, R.drawable.tabbar_icon_home, R.drawable.tabbar_icon_home_selecotr); view.setBackgroundDrawable(this.getResources().getDrawable( R.drawable.footer_view_selector)); intent = new Intent(MainActivity.this, HomeActivity.class); spec = tabHost.newTabSpec("num1").setIndicator(view).setContent(intent); tabHost.addTab(spec); view = new TabView(this, R.drawable.tabbar_icon_search, R.drawable.tabbar_icon_search_selecotr); view.setBackgroundDrawable(this.getResources().getDrawable( R.drawable.footer_view_selector)); intent = new Intent(MainActivity.this, HomeActivity.class); spec = tabHost.newTabSpec("num2").setIndicator(view).setContent(intent); tabHost.addTab(spec); view = new TabView(this, R.drawable.tabbar_icon_cart, R.drawable.tabbar_icon_cart_selector); view.setBackgroundDrawable(this.getResources().getDrawable( R.drawable.footer_view_selector)); intent = new Intent(MainActivity.this, HomeActivity.class); spec = tabHost.newTabSpec("num3").setIndicator(view).setContent(intent); tabHost.addTab(spec); view = new TabView(this, R.drawable.tabbar_icon_more, R.drawable.tabbar_icon_more_selecotr); view.setBackgroundDrawable(this.getResources().getDrawable( R.drawable.footer_view_selector)); intent = new Intent(MainActivity.this, HomeActivity.class); spec = tabHost.newTabSpec("num4").setIndicator(view).setContent(intent); tabHost.addTab(spec); }
- /***
- * 自定义view
- *
- */
- class TabView extends LinearLayout {
- ImageView imageView;
- public TabView(Context c, int drawable, int drawableselec) {
- super(c);
- imageView = new ImageView(c);
- // 可以定制点击后状态
- StateListDrawable listDrawable = new StateListDrawable();
- // 未选
- listDrawable.addState(SELECTED_STATE_SET, this.getResources()
- .getDrawable(drawableselec));
- // 选择
- listDrawable.addState(ENABLED_STATE_SET, this.getResources()
- .getDrawable(drawable));
- imageView.setImageDrawable(listDrawable);// 引用 StateListDrawable
- setGravity(Gravity.CENTER);
- addView(imageView);
- }
- }
/*** * 自定义view * */ class TabView extends LinearLayout { ImageView imageView; public TabView(Context c, int drawable, int drawableselec) { super(c); imageView = new ImageView(c); // 可以定制点击后状态 StateListDrawable listDrawable = new StateListDrawable(); // 未选 listDrawable.addState(SELECTED_STATE_SET, this.getResources() .getDrawable(drawableselec)); // 选择 listDrawable.addState(ENABLED_STATE_SET, this.getResources() .getDrawable(drawable)); imageView.setImageDrawable(listDrawable);// 引用 StateListDrawable setGravity(Gravity.CENTER); addView(imageView); } }
这样我们就实现想要的效果了.(建议使用这种方法,我的项目就是用的这个实现的.)
如果我是图标和文字分开的,我们也可以用(RadioButton代替,也许大家都不陌生,一会我简单介绍下)
这个源码是因为项目里面用的。有时间整理下上传上去,不过我相信大家看过都会做出来的.
第二种方法:GridView+ActivityGroup (图片 ,文字)
(为了省事,我把上下tab分页整理到一个demo里面了.)
这个的布局文件我就不显示了,因为比较简单,我们还是来看代码吧.
代码片段:
- /***
- * 适配器
- *
- * @author Administrator
- *
- */
- public class ImageAdapter extends BaseAdapter {
- private Context mContext;
- private ImageTextButton[] imgItems;
- private int selResId;
- /***
- *
- * @param c
- * @param picIds
- * @param titles
- * @param width
- * @param height
- * @param selResId
- */
- public ImageAdapter(Context c, int[] picIds, String titles[], int width,
- int height, int selResId) {
- mContext = c;
- this.selResId = selResId;
- imgItems = new ImageTextButton[picIds.length];
- for (int i = 0; i < picIds.length; i++) {
- imgItems[i] = new ImageTextButton(mContext);
- imgItems[i]
- .setLayoutParams(new GridView.LayoutParams(width, height));// 设置ImageView宽高
- imgItems[i].setPadding(2, 2, 2, 2);
- // 显示图片与文本
- imgItems[i].setImageResource(picIds[i], titles[i]);
- }
- }
- @Override
- public int getCount() {
- return imgItems.length;
- }
- @Override
- public Object getItem(int position) {
- return position;
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- /***
- * 设置选中后的效果
- */
- public void SetFocus(int index) {
- for (int i = 0; i < imgItems.length; i++) {
- // 先把所有设为最初状态
- if (i != index) {
- imgItems[i].setBackgroundResource(0);// 回到最初样式
- }
- }
- // 选中设置
- imgItems[index].setBackgroundResource(selResId);
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ImageTextButton imageView;
- if (convertView == null) {
- imageView = imgItems[position];
- } else {
- imageView = (ImageTextButton) convertView;
- }
- return imageView;
- }
- }
/*** * 适配器 * * @author Administrator * */ public class ImageAdapter extends BaseAdapter { private Context mContext; private ImageTextButton[] imgItems; private int selResId; /*** * * @param c * @param picIds * @param titles * @param width * @param height * @param selResId */ public ImageAdapter(Context c, int[] picIds, String titles[], int width, int height, int selResId) { mContext = c; this.selResId = selResId; imgItems = new ImageTextButton[picIds.length]; for (int i = 0; i < picIds.length; i++) { imgItems[i] = new ImageTextButton(mContext); imgItems[i] .setLayoutParams(new GridView.LayoutParams(width, height));// 设置ImageView宽高 imgItems[i].setPadding(2, 2, 2, 2); // 显示图片与文本 imgItems[i].setImageResource(picIds[i], titles[i]); } } @Override public int getCount() { return imgItems.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } /*** * 设置选中后的效果 */ public void SetFocus(int index) { for (int i = 0; i < imgItems.length; i++) { // 先把所有设为最初状态 if (i != index) { imgItems[i].setBackgroundResource(0);// 回到最初样式 } } // 选中设置 imgItems[index].setBackgroundResource(selResId); } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageTextButton imageView; if (convertView == null) { imageView = imgItems[position]; } else { imageView = (ImageTextButton) convertView; } return imageView; } }在这里我们用到了自定义控件,其实就是把imageview 和textview 整到一起了,
- /***
- * 自定义控件(图片文字)
- */
- public class ImageTextButton extends LinearLayout {
- private ImageView button = null;
- private TextView text = null;
- private Context context;
- public ImageTextButton(Context context) {
- this(context, null);
- this.context = context;
- }
- public ImageTextButton(Context context, AttributeSet attrs) {
- super(context, attrs);
- LayoutInflater.from(context).inflate(R.layout.imagetextbutton, this,
- true);
- button = (ImageView) this.findViewById(R.id.button);
- text = (TextView) this.findViewById(R.id.btnText);
- text.setSingleLine(true);
- }
- public void setImageResource(int image_id, String title) {
- Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
- image_id);
- button.setBackgroundDrawable(new BitmapDrawable(bitmap));
- text.setText(title);
- }
- public void setImageBitmap(Bitmap bitmap) {
- if (button != null)
- button.setImageBitmap(bitmap);
- }
- public void setBackgroundDrawable(Drawable drawable, int Width, int Hdight) {
- if (button != null) {
- button.setBackgroundDrawable(drawable);
- button.setMinimumHeight(Hdight);
- button.setMinimumWidth(Width);
- }
- }
- public void setText(String title) {
- if (text != null)
- text.setText(title);
- }
- public void setText(int ResID) {
- if (text != null)
- text.setText(ResID);
- }
- public void setWidth(int width) {
- button.setMaxWidth(width);
- }
- public void setHeight(int height) {
- button.setMaxHeight(height);
- }
- }
/*** * 自定义控件(图片文字) */ public class ImageTextButton extends LinearLayout { private ImageView button = null; private TextView text = null; private Context context; public ImageTextButton(Context context) { this(context, null); this.context = context; } public ImageTextButton(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.imagetextbutton, this, true); button = (ImageView) this.findViewById(R.id.button); text = (TextView) this.findViewById(R.id.btnText); text.setSingleLine(true); } public void setImageResource(int image_id, String title) { Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), image_id); button.setBackgroundDrawable(new BitmapDrawable(bitmap)); text.setText(title); } public void setImageBitmap(Bitmap bitmap) { if (button != null) button.setImageBitmap(bitmap); } public void setBackgroundDrawable(Drawable drawable, int Width, int Hdight) { if (button != null) { button.setBackgroundDrawable(drawable); button.setMinimumHeight(Hdight); button.setMinimumWidth(Width); } } public void setText(String title) { if (text != null) text.setText(title); } public void setText(int ResID) { if (text != null) text.setText(ResID); } public void setWidth(int width) { button.setMaxWidth(width); } public void setHeight(int height) { button.setMaxHeight(height); } }我们只需要在oncreate中调用即可:
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Navigation_Top_Bar = (GridView) this
- .findViewById(R.id.Navigation_Top_Bar);
- Navigation_Buttom_Bar = (GridView) this
- .findViewById(R.id.Navigation_Buttom_Bar);
- // 获取显示宽度
- int width = this.getWindowManager().getDefaultDisplay().getWidth()
- / topbar_image_array.length;
- topImgAdapter1 = new ImageAdapter(this, topbar_image_array, titles,
- width, 100, R.drawable.cover);
- Init(Navigation_Top_Bar, topImgAdapter1);
- ButtomImgAdapter2 = new ImageAdapter(this, topbar_image_array, titles,
- width, 100, R.drawable.cover);
- Init(Navigation_Buttom_Bar, ButtomImgAdapter2);
- }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Navigation_Top_Bar = (GridView) this .findViewById(R.id.Navigation_Top_Bar); Navigation_Buttom_Bar = (GridView) this .findViewById(R.id.Navigation_Buttom_Bar); // 获取显示宽度 int width = this.getWindowManager().getDefaultDisplay().getWidth() / topbar_image_array.length; topImgAdapter1 = new ImageAdapter(this, topbar_image_array, titles, width, 100, R.drawable.cover); Init(Navigation_Top_Bar, topImgAdapter1); ButtomImgAdapter2 = new ImageAdapter(this, topbar_image_array, titles, width, 100, R.drawable.cover); Init(Navigation_Buttom_Bar, ButtomImgAdapter2); }这个实现起来有点复杂,不过用习惯了会觉得别有一翻风味的.我之前就一直用这个方法.
在这里我要说明一点:
imgItems[i].setLayoutParams(new GridView.LayoutParams(width, height));// 设置ImageView宽高
其他的都是细节上的问题,我想你们看过都会ok的.
效果图:
(怎么样,效果还不错吧。就是实现起来有点负责,不过习惯就好.)
第三种方法:ActivityGroup+一些TextView布局.(在这里我们自定实现动态滚动效果)
详情请查看前面一片文章:android 分页Title栏滑块效果--ActionBar(模拟网易 腾讯等动态效果)
分页Tab的实现方法和上面方法类是,都是运用ActivityGroup的性质,而上面是通过GridView生成,而我们这边是我们自定义View控件实现.
这里我主要说一下怎样实现ActionBar:
代码片段:
- /***
- * 自定义控件
- *
- * @author zhangjia
- *
- * 在这里我要说明一点 我们在创建RectF矩形的时候,
- *
- * 参照物原点是所在"父控件的左上角".
- *
- */
- public class ActionBar extends LinearLayout implements OnClickListener {
- private ImageView tv1;
- private ImageView tv2;
- private ImageView tv3;
- private ImageView tv4;
- private Paint paint;// 画笔
- private RectF curRectF;// draw当前bar
- private RectF tarRectF;// draw被点击bar
- private final int space_x = 0;// 相当于pading.
- private final int space_y = 0;// 相当于pading
- private final double step = 32;// 速度step.
- public ActionBar(Context context) {
- super(context);
- }
- /***
- * 构造方法
- *
- * @param context
- * @param attrs
- */
- public ActionBar(Context context, AttributeSet attrs) {
- super(context, attrs);
- setWillNotDraw(false);
- LayoutInflater.from(context).inflate(R.layout.action_bar, this, true);
- paint = new Paint();
- paint.setAntiAlias(true);
- tv1 = (ImageView) findViewById(R.id.tv1);
- tv2 = (ImageView) findViewById(R.id.tv2);
- tv3 = (ImageView) findViewById(R.id.tv3);
- tv4 = (ImageView) findViewById(R.id.tv4);
- tv1.setOnClickListener(this);
- tv2.setOnClickListener(this);
- tv3.setOnClickListener(this);
- tv4.setOnClickListener(this);
- curRectF = null;
- tarRectF = null;
- }
- /***
- * invalidate():调用这个方法会执行onDraw()方法,但是前提是:自己把invalidate()方法执行结束在进行执行.
- */
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- canvas.drawColor(Color.BLACK);
- paint.setColor(Color.RED);
- // 如果当前curRectF=null,也就是第一次访问,则默认为draw第一个bar
- if (curRectF == null)
- curRectF = new RectF(tv1.getLeft() + space_x, tv1.getTop()
- + space_y, tv1.getRight() - space_x, tv1.getBottom()
- - space_y);
- // 第一次方位tarRectF=null,默认为draw
- if (tarRectF == null)
- tarRectF = new RectF(tv1.getLeft() + space_x, tv1.getTop()
- + space_y, tv1.getRight() - space_x, tv1.getBottom()
- - space_y);
- /***
- * 作用:如果在这个范围内则,以这个为最终位置,(不明的白的话,你可以把这个注释运行下你就知道why了.)
- */
- if (Math.abs(curRectF.left - tarRectF.left) < step) {
- curRectF.left = tarRectF.left;
- curRectF.right = tarRectF.right;
- }
- /***
- * 说明目标在当前的左侧,需要向左移动(每次矩形移动step,则进行invalidate(),从新进行移动...)
- */
- if (curRectF.left > tarRectF.left) {
- curRectF.left -= step;
- curRectF.right -= step;
- invalidate();// 继续刷新,从而实现滑动效果,每次step32.
- }
- /***
- * 说明目标在当前的右侧,需要向右移动(每次矩形移动step,则进行invalidate(),从新进行移动...)
- */
- else if (curRectF.left < tarRectF.left) {
- curRectF.left += step;
- curRectF.right += step;
- invalidate();
- }
- // canvas.drawRect(curRectF, paint);
- // 参数,矩形,弧度,画笔
- canvas.drawRoundRect(curRectF, 5, 5, paint);
- }
- /****
- * 这里要记录目标矩形的坐标
- */
- @Override
- public void onClick(View v) {
- tarRectF.left = v.getLeft() + space_x;
- tarRectF.right = v.getRight() - space_x;
- invalidate();// 刷新
- System.out.println("tarRectF.top=" + tarRectF.top + ",v.getTop()="
- + v.getTop() + ", v.getBottom()" + v.getBottom());
- }
- }
/*** * 自定义控件 * * @author zhangjia * * 在这里我要说明一点 我们在创建RectF矩形的时候, * * 参照物原点是所在"父控件的左上角". * */ public class ActionBar extends LinearLayout implements OnClickListener { private ImageView tv1; private ImageView tv2; private ImageView tv3; private ImageView tv4; private Paint paint;// 画笔 private RectF curRectF;// draw当前bar private RectF tarRectF;// draw被点击bar private final int space_x = 0;// 相当于pading. private final int space_y = 0;// 相当于pading private final double step = 32;// 速度step. public ActionBar(Context context) { super(context); } /*** * 构造方法 * * @param context * @param attrs */ public ActionBar(Context context, AttributeSet attrs) { super(context, attrs); setWillNotDraw(false); LayoutInflater.from(context).inflate(R.layout.action_bar, this, true); paint = new Paint(); paint.setAntiAlias(true); tv1 = (ImageView) findViewById(R.id.tv1); tv2 = (ImageView) findViewById(R.id.tv2); tv3 = (ImageView) findViewById(R.id.tv3); tv4 = (ImageView) findViewById(R.id.tv4); tv1.setOnClickListener(this); tv2.setOnClickListener(this); tv3.setOnClickListener(this); tv4.setOnClickListener(this); curRectF = null; tarRectF = null; } /*** * invalidate():调用这个方法会执行onDraw()方法,但是前提是:自己把invalidate()方法执行结束在进行执行. */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.BLACK); paint.setColor(Color.RED); // 如果当前curRectF=null,也就是第一次访问,则默认为draw第一个bar if (curRectF == null) curRectF = new RectF(tv1.getLeft() + space_x, tv1.getTop() + space_y, tv1.getRight() - space_x, tv1.getBottom() - space_y); // 第一次方位tarRectF=null,默认为draw if (tarRectF == null) tarRectF = new RectF(tv1.getLeft() + space_x, tv1.getTop() + space_y, tv1.getRight() - space_x, tv1.getBottom() - space_y); /*** * 作用:如果在这个范围内则,以这个为最终位置,(不明的白的话,你可以把这个注释运行下你就知道why了.) */ if (Math.abs(curRectF.left - tarRectF.left) < step) { curRectF.left = tarRectF.left; curRectF.right = tarRectF.right; } /*** * 说明目标在当前的左侧,需要向左移动(每次矩形移动step,则进行invalidate(),从新进行移动...) */ if (curRectF.left > tarRectF.left) { curRectF.left -= step; curRectF.right -= step; invalidate();// 继续刷新,从而实现滑动效果,每次step32. } /*** * 说明目标在当前的右侧,需要向右移动(每次矩形移动step,则进行invalidate(),从新进行移动...) */ else if (curRectF.left < tarRectF.left) { curRectF.left += step; curRectF.right += step; invalidate(); } // canvas.drawRect(curRectF, paint); // 参数,矩形,弧度,画笔 canvas.drawRoundRect(curRectF, 5, 5, paint); } /**** * 这里要记录目标矩形的坐标 */ @Override public void onClick(View v) { tarRectF.left = v.getLeft() + space_x; tarRectF.right = v.getRight() - space_x; invalidate();// 刷新 System.out.println("tarRectF.top=" + tarRectF.top + ",v.getTop()=" + v.getTop() + ", v.getBottom()" + v.getBottom()); } }上面已经讲的很详细了,就不啰嗦了.
效果图:
大致就这么多了。
额外:还有一点就是有的会用到RadioButton这个控件,其实就是对其进行了一些调整,这里我简单说明一下应用:
可以取消button样式,用android:drawableTop显示图片,从而达到想要的效果.
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <RadioGroup
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- android:background="@drawable/maintab_toolbar_bg"
- android:gravity="center"
- android:orientation="horizontal" >
- <RadioButton
- android:id="@+id/button1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- android:layout_weight="1"
- android:background="@drawable/home_btn_bg"
- android:button="@null"
- android:drawableTop="@drawable/icon_1_n"
- android:gravity="center"
- android:paddingTop="5dp"
- android:text="首页"
- android:textSize="12sp" />
- <RadioButton
- android:id="@+id/button2"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:background="@drawable/home_btn_bg"
- android:button="@null"
- android:drawableTop="@drawable/icon_2_n"
- android:gravity="center"
- android:paddingTop="5dp"
- android:text="短信"
- android:textSize="12sp" />
- <RadioButton
- android:id="@+id/button3"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:background="@drawable/home_btn_bg"
- android:button="@null"
- android:drawableTop="@drawable/icon_3_n"
- android:gravity="center"
- android:paddingTop="5dp"
- android:text="联系人"
- android:textSize="12sp" />
- <RadioButton
- android:id="@+id/button4"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:background="@drawable/home_btn_bg"
- android:button="@null"
- android:drawableTop="@drawable/icon_4_n"
- android:gravity="center"
- android:paddingTop="5dp"
- android:text="搜索"
- android:textSize="12sp" />
- </RadioGroup>
- </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="@drawable/maintab_toolbar_bg" android:gravity="center" android:orientation="horizontal" > <RadioButton android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:layout_weight="1" android:background="@drawable/home_btn_bg" android:button="@null" android:drawableTop="@drawable/icon_1_n" android:gravity="center" android:paddingTop="5dp" android:text="首页" android:textSize="12sp" /> <RadioButton android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/home_btn_bg" android:button="@null" android:drawableTop="@drawable/icon_2_n" android:gravity="center" android:paddingTop="5dp" android:text="短信" android:textSize="12sp" /> <RadioButton android:id="@+id/button3" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/home_btn_bg" android:button="@null" android:drawableTop="@drawable/icon_3_n" android:gravity="center" android:paddingTop="5dp" android:text="联系人" android:textSize="12sp" /> <RadioButton android:id="@+id/button4" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/home_btn_bg" android:button="@null" android:drawableTop="@drawable/icon_4_n" android:gravity="center" android:paddingTop="5dp" android:text="搜索" android:textSize="12sp" /> </RadioGroup> </RelativeLayout>这里我们还需要selector.xml
实现点击效果.
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/home_btn_bg_s" android:state_enabled="true" android:state_focused="true" android:state_pressed="false"/>
- <item android:drawable="@drawable/home_btn_bg_s" android:state_enabled="true" android:state_pressed="true"/>
- <item android:drawable="@drawable/home_btn_bg_d" android:state_checked="true" android:state_enabled="true"/>
- </selector>
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/home_btn_bg_s" android:state_enabled="true" android:state_focused="true" android:state_pressed="false"/> <item android:drawable="@drawable/home_btn_bg_s" android:state_enabled="true" android:state_pressed="true"/> <item android:drawable="@drawable/home_btn_bg_d" android:state_checked="true" android:state_enabled="true"/> </selector>
示例图:
就说这么多了,情况因人而异.
- <PRE></PRE>
- <PRE></PRE>
- <PRE></PRE>
- <PRE></PRE>
- <PRE></PRE>
- <PRE></PRE>
- <PRE></PRE>
发表评论
-
Android客户端代码保护技术-完整性校验
2018-01-08 17:10 1317由于Android系统固有的缺陷、Android应用分发 ... -
android开发中手动v2签名实现方法
2018-01-08 10:31 1117用v2签名前要进行v1签名或zipalign。 1. z ... -
webview支持LocalStorage本地存储
2017-03-31 10:30 1395//允许JavaScript执行 ... -
七步配置phonegap+cordova+ionic开发环境
2016-12-19 16:21 727本文讲的是Android混合 ... -
梆梆加固破解
2016-10-13 09:01 1573本文假设你已经使用过梆梆加固,手头至少有个一个通过梆梆加固后 ... -
android zxing 扫描二维码 横屏转竖屏
2016-09-14 15:41 0Zxing 竖屏切换 Android 在google上下 ... -
封装Volley使Volley的每个请求都自动保存和发送Cookie
2016-09-14 10:57 0思路很简单,每次请求获取到服务器返回的response就解 ... -
Android二维码ZXing扫描区域大小的调整,提高扫描速度
2016-09-14 10:48 2681Zxing本身默认的扫图区域最大只有 360*480 ... -
解决Android二维码扫描ZXing竖屏拉伸变长闪退扫描区域小等问题
2016-09-14 10:42 1296Android 基于google Zxing实现二维码、条形 ... -
Android平台下利用zxing实现二维码开发
2016-09-14 09:25 519现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研 ... -
Zxing扫描二维码
2016-09-14 09:24 695摘要 android Zxing扫描二维码 横竖屏 ... -
Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
2016-09-14 09:18 546转载请注明出处:http://blog.csdn.net/x ... -
React Native应用部署/热更新-CodePush最新集成总结
2016-08-02 11:06 610本文出自《React Native学习笔记》系列文章。 ... -
让微信二维码扫描您的APK
2016-07-27 11:26 1554二维码深入人心,很多App都在官网挂出了可以扫描下载apk的 ... -
Activity类的runOnUiThread方法
2016-07-22 10:40 803[javascript] view plain c ... -
Can't create handler inside thread that has not called Looper.prepare()
2016-07-22 10:24 664错误信息:在Android开发中,如果在一个Thread中启 ... -
Android编程之解决android-support-v4打包问题
2016-07-21 09:27 584如果工程引入了android-support-v4的jar类 ... -
Android 编程下的代码混淆之(android-support-v4.jar)
2016-07-21 09:24 426项目在代码混淆过程中如果引用了第三方 Jar 包,需要在混淆 ... -
phoneGap可行性分析
2016-07-20 16:25 5431 移动应用现状 移动应用产品往往常 ... -
梆梆SDKs详细分析(1) - 防界面劫持SDK
2016-07-20 10:23 816前言 前段时间,国外知名的安全公司fireeye发 ...
相关推荐
7. **适配不同屏幕尺寸**: Android设备有各种各样的屏幕尺寸,因此,一个好的Demo会考虑如何让Tab分页菜单在不同设备上表现良好,包括平板电脑和手机。这可能涉及到使用比例值、dp单位、或者使用ConstraintLayout等...
在Android应用开发中,创建一个用户友好的界面是至关重要的,而Tab分页菜单就是实现这一目标的有效方式。本文将详细讲解如何在Android中实现带有滑动切换功能的Tab分页菜单,包括两种常见的实现方法:TabHost和...
在Android应用开发中,Tab分页式菜单是一种常见的用户界面设计模式,用于组织大量内容或功能,让用户可以方便地在不同的视图之间切换。在这个"Android应用源码之(Tab分页式菜单)"的项目中,我们可以深入学习如何构建...
总结来说,通过结合`GridView`和`ActivityGroup`,我们可以创建一个功能完善的Tab分页菜单,让用户在应用中轻松地在不同的内容页面之间切换。随着Android API的发展,现在更推荐使用Fragment和`FragmentTabHost`来...
【Android应用源码之(Tab分页式菜单)】是一个典型的Android应用开发示例,它展示了如何在Android平台上实现Tab分页式菜单的功能。Tab分页通常用于在多个视图间切换,为用户提供清晰的导航结构。这个源码库可能是为了...
本篇文章将详细探讨如何在Android中实现Tab分页标签,特别是可滑动的Tab的三种实现方法。 1. **使用Android Support Library (TabLayout)** Android Support Library提供了`TabLayout`组件,它与`ViewPager`配合...
本资源“安卓Android源码——(Tab分页式菜单).rar”提供了一个关于如何在Android平台上实现Tab分页菜单的示例代码。 1. **TabHost与TabWidget**: 在早期的Android版本中,Tab分页主要通过TabHost和TabWidget组件来...
"安卓Android源码——(Tab分页式菜单).zip"这个压缩包很可能是包含了一个完整的示例项目,用于展示如何在Android应用中实现Tab分页菜单。 在Android中,实现Tab分页式菜单有多种方式,早期的版本通常使用`TabHost`...
这份"应用源码之(Tab分页式菜单)"的压缩包资源,显然为我们提供了关于如何在Android应用中实现这种功能的实际代码示例。以下是围绕这个主题的详细知识点讲解: 1. **TabLayout**:TabLayout是Android Support ...
本篇文章将详细探讨如何通过`ActionBar`来实现分页菜单,并结合`ActivityGroup`和`TextView`布局,实现动态滚动效果。 首先,`ActionBar`的分页功能通常借助`TabHost`或`ViewPager`来完成。`TabHost`在早期版本的...
在Android应用开发中,Tab分页标签是一种常见的用户界面设计,用于展示多个相互关联的页面或视图。这种设计能够帮助用户轻松地在不同的功能或数据集之间切换。本篇文章将详细探讨如何利用ActivityGroup来实现这样的...
总结来说,"带侧拉菜单tab分页导航并且有信息数目提示的主页框架"是一个集成了多种核心功能的UI结构,它有效地利用了Android的系统组件,并通过自定义逻辑解决了横竖向滑动冲突。这个框架对于任何需要清晰导航和信息...
标题 "3-9(Tab分页式菜单)" 暗示了这个压缩包可能包含一个教学或示例项目,展示了如何在用户界面中实现Tab分页式菜单的设计。这种设计通常用于应用程序或网站中,以帮助用户在多个相关但独立的内容区域之间轻松切换...
完成以上步骤后,你就成功地在Android应用中创建了一个使用分页控件实现的底部菜单。在提供的`myTabTest`项目文件中,应该包含了实现这一功能的具体代码示例。通过分析和学习这个示例,你可以更好地理解和掌握这个...
4. 使用ViewPager和Fragment实现分页菜单。 5. 编写适配器,为ViewPager提供不同页面(菜单项)的Fragment。 6. 处理点击事件,实现菜单项的功能。 通过以上步骤,你可以创建出符合自己需求的自定义菜单,提升应用...
在Android应用开发中,创建一个类似淘宝或京东商品详情页的滑动切换Tab效果是常见的需求,这可以提升用户体验并使界面更具交互性。在这个项目中,我们将利用`TabLayout`和`RecyclerView`来实现这一功能。`TabLayout`...
在安卓应用开发中,Tab-Tabbed Menu 是一个常见的用户界面设计模式,它允许用户通过在顶部或底部的标签之间切换...这个项目为初学者提供了一个很好的实践平台,让他们能够深入理解并掌握Android应用中的Tab式菜单实现。