Android选项卡动态滑动效果
来源:互联网 发布:linux 版本 编辑:程序博客网 时间:2024/05/03 09:54
本文会实现一个类似网易新闻(不说网易新闻大家可能不知道大概是什么样子)点击超多选项卡,选项卡动态滑动的效果。
首先来看看布局,就是用HorizontalScrollView控件来实现滑动的效果,里面包含了一个布局。
<?xml version="1.0" encoding="utf-8"?><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" tools:context=".TabbarActivity"> <LinearLayout android:id="@+id/ll_activity_tabbar_all" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <HorizontalScrollView android:id="@+id/hs_activity_tabbar" android:layout_width="fill_parent" android:layout_height="40dp" android:background="@android:color/white" android:fadingEdge="none" android:scrollbars="none"> <LinearLayout android:id="@+id/ll_activity_tabbar_content" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> </LinearLayout> </HorizontalScrollView> </LinearLayout> <TextView android:id="@+id/tv_tabname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:layout_centerInParent="true" /></RelativeLayout>
接下来我们在onCreat方法中加载布局和构建我们需要显示的数据
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tabbar); tv_tabname= (TextView) this.findViewById(R.id.tv_tabname); titleList = new ArrayList<String>(); titleList.add("推荐"); titleList.add("热点"); titleList.add("北京"); titleList.add("体育"); titleList.add("娱乐"); titleList.add("足球"); titleList.add("巴萨"); titleList.add("汽车"); }
加载布局,用RadioGroup动态的加载多个自定义的RadioButton
hs_activity_tabbar= (HorizontalScrollView) this.findViewById(R.id.hs_activity_tabbar); ll_activity_tabbar_content= (LinearLayout) this.findViewById(R.id.ll_activity_tabbar_content); //选项卡布局 myRadioGroup = new RadioGroup(this); myRadioGroup.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); myRadioGroup.setOrientation(LinearLayout.HORIZONTAL); ll_activity_tabbar_content.addView(myRadioGroup); for (int i = 0; i < titleList.size(); i++) { String channel = titleList.get(i); RadioButton radio = new RadioButton(this); radio.setButtonDrawable(android.R.color.transparent); radio.setBackgroundResource(R.drawable.radiobtn_selector); ColorStateList csl = getResources().getColorStateList(R.color.radiobtn_text_color); radio.setTextColor(csl); LinearLayout.LayoutParams l = new LinearLayout.LayoutParams((int) SizeHelper.dp2px(this, 80), ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER); radio.setLayoutParams(l); radio.setTextSize(15); radio.setGravity(Gravity.CENTER); radio.setText(channel); radio.setTag(channel); myRadioGroup.addView(radio); }
最后也就点击选项卡的时候会有一个动态滑动的效果,其实就是利用HorizontalScrollView的smoothScrollTo方法来实现的
myRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { int radioButtonId = group.getCheckedRadioButtonId(); //根据ID获取RadioButton的实例 RadioButton rb = (RadioButton) findViewById(radioButtonId); channel = (String) rb.getTag(); mCurrentCheckedRadioLeft = rb.getLeft();//更新当前按钮距离左边的距离 int width=(int) SizeHelper.dp2px(TabbarActivity.this, 140); hs_activity_tabbar.smoothScrollTo((int) mCurrentCheckedRadioLeft - width, 0); tv_tabname.setText(channel); } }); //设定默认被选中的选项卡为第一项 if (!titleList.isEmpty()) { myRadioGroup.check(myRadioGroup.getChildAt(0).getId()); }
dp2px方法如下用来将dp转换为px:
public static float dp2px(Context context, float dp) { final float scale = context.getResources().getDisplayMetrics().density; return (dp * scale); }
全部代码为:
package com.example.liuwangshu.myslidetabbar;import android.content.res.ColorStateList;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.Gravity;import android.view.ViewGroup;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class TabbarActivity extends AppCompatActivity { private HorizontalScrollView hs_activity_tabbar; private RadioGroup myRadioGroup; private List<String> titleList; private LinearLayout ll_activity_tabbar_content; private float mCurrentCheckedRadioLeft;//当前被选中的RadioButton距离左侧的距离 private String channel; private TextView tv_tabname; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tabbar); tv_tabname= (TextView) this.findViewById(R.id.tv_tabname); titleList = new ArrayList<String>(); titleList.add("推荐"); titleList.add("热点"); titleList.add("北京"); titleList.add("体育"); titleList.add("娱乐"); titleList.add("足球"); titleList.add("巴萨"); titleList.add("汽车"); initGroup(); } private void initGroup() { hs_activity_tabbar= (HorizontalScrollView) this.findViewById(R.id.hs_activity_tabbar); ll_activity_tabbar_content= (LinearLayout) this.findViewById(R.id.ll_activity_tabbar_content); //选项卡布局 myRadioGroup = new RadioGroup(this); myRadioGroup.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); myRadioGroup.setOrientation(LinearLayout.HORIZONTAL); ll_activity_tabbar_content.addView(myRadioGroup); for (int i = 0; i < titleList.size(); i++) { String channel = titleList.get(i); RadioButton radio = new RadioButton(this); radio.setButtonDrawable(android.R.color.transparent); radio.setBackgroundResource(R.drawable.radiobtn_selector); ColorStateList csl = getResources().getColorStateList(R.color.radiobtn_text_color); radio.setTextColor(csl); LinearLayout.LayoutParams l = new LinearLayout.LayoutParams((int) SizeHelper.dp2px(this, 80), ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER); radio.setLayoutParams(l); radio.setTextSize(15); radio.setGravity(Gravity.CENTER); radio.setText(channel); radio.setTag(channel); myRadioGroup.addView(radio); } myRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { int radioButtonId = group.getCheckedRadioButtonId(); //根据ID获取RadioButton的实例 RadioButton rb = (RadioButton) findViewById(radioButtonId); channel = (String) rb.getTag(); mCurrentCheckedRadioLeft = rb.getLeft();//更新当前按钮距离左边的距离 int width=(int) SizeHelper.dp2px(TabbarActivity.this, 140); hs_activity_tabbar.smoothScrollTo((int) mCurrentCheckedRadioLeft - width, 0); tv_tabname.setText(channel); } }); //设定默认被选中的选项卡为第一项 if (!titleList.isEmpty()) { myRadioGroup.check(myRadioGroup.getChildAt(0).getId()); } }}
来看看效果
源码下载
0 2
- Android选项卡动态滑动效果
- Android选项卡动态滑动效果
- Android实现仿网易首页选项卡动态滑动效果
- Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果
- Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果
- Android用TabLayout实现类似网易选项卡动态滑动效果
- Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果
- Android用TabLayout实现类似网易选项卡动态滑动效果
- Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果
- Android用TabLayout实现类似网易选项卡动态滑动效果
- js滑动效果,适用选项卡等
- Viewpager 选项卡的滑动动画效果
- Android 选项卡效果
- android选项卡,菜单滑动
- Android横向滑动选项卡
- Android viewpage滑动选项卡
- 安卓选项卡动态滑动
- Android 通过ViewPager实现微信选项卡滑动的效果
- CSS复习总结(6)
- C#中字符串的方法
- 51Nod A^BmodC
- 当不知所措时,做最简单的事
- Maven 基础知识大全
- Android选项卡动态滑动效果
- objective-C多线程NSThread
- 51Nod 逆序数
- Handler+动画实现
- 【读书有感】你只是看起来很努力
- svn 不能提交.a文件问题的解决方法
- 打造先进的内存KV数据库-2 B树索引的建立(2)
- got error 28 from storage engine
- Ext.js5带过滤功能的表格(defaultListenerScope 作用域)(17)