package com.goach.tabdemo.view;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.goach.tabdemo.R;
import com.goach.tabdemo.util.AppUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by 钟光新 on 2016/9/24 0024.
* 1.
*/
public class ZTabLayout extends HorizontalScrollView {
//默认字体大小
private final int DEFAULT_NORMAL_TEXT_SIZE_SP = AppUtils.sp2px(14);
private int mNormalTextSize = DEFAULT_NORMAL_TEXT_SIZE_SP;
//选中字体大小
private final int DEFAULT_SELECT_TEXT_SIZE_SP = AppUtils.sp2px(16);
private int mSelectTextSize = DEFAULT_SELECT_TEXT_SIZE_SP;
//字体颜色
private final int DEFAULT_NORMAL_TEXT_COLOR = Color.BLACK;
private final int DEFAULT_SELECT_TEXT_COLOR = Color.RED;
private ColorStateList mTextColor;
//指示器高度
private final int DEFAULT_INDICATOR_HEIGHT_DP = AppUtils.dp2px(2);
private int mIndicatorHeight = DEFAULT_INDICATOR_HEIGHT_DP ;
//指示器颜色
private final int DEFAULT_INDICATOR_COLOR = Color.RED;
private int mIndicatorColor = DEFAULT_INDICATOR_COLOR ;
//tab最小宽度
private final int DEFAULT_TAB_MIN_WIDTH = AppUtils.dp2px(50);
private int mMinTabWidth = DEFAULT_TAB_MIN_WIDTH;
//tab之间的间距
private int mTabPadding;
//关联的viewpager
private ViewPager mViewPager;
//第一个子View
private IndicationTabLayout mTabContainer;
//Tab总数
private int mTabCount;
//当前选中的Tab
private int mCurrentTabPosition;
//当前切换Tab的偏移量
private float mCurrentOffset;
//数据源
private List<String> mDataList;
//中间线
private final int DEFAULT_DIVIDER_WIDTH =AppUtils.dp2px(1);
private int mDividerWidth = DEFAULT_DIVIDER_WIDTH;
private final int DEFAULT_DIVIDER_COLOR = Color.GRAY;
private int mDividerColor = DEFAULT_DIVIDER_COLOR;
private Paint mDividerPaint;
private int DEFAULT_DIVIDER_PADDING = AppUtils.dp2px(5);
private int mDividerPadding = DEFAULT_DIVIDER_PADDING ;
private boolean hasShowDivider = false ;
//红点显示
private final int DEFAULT_MSG_ROUND_COLOR = Color.RED;
private int mMsgRoundColor = DEFAULT_MSG_ROUND_COLOR;
private SparseBooleanArray mInitSetMap ;
private SparseIntArray mMsgNumMap;
private Paint mMsgPaint;
private Paint mMsgNumPaint;
private int mMsgNumColor = Color.WHITE;
private int mMsgTextSizeSp = AppUtils.sp2px(8);
private int mMsgPadding;
public ZTabLayout(Context context) {
this(context,null);
}
public ZTabLayout(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public ZTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initStyle(context,attrs);
setFillViewport(true);
setHorizontalScrollBarEnabled(false);
mTabContainer = new IndicationTabLayout(context);
mTabContainer.setSelectedIndicatorColor(mIndicatorColor);
mTabContainer.setSelectedIndicatorHeight(mIndicatorHeight);
addView(mTabContainer,0, new HorizontalScrollView.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
mDataList = new ArrayList<>();
mDividerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mMsgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mMsgNumPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mInitSetMap = new SparseBooleanArray();
mMsgNumMap = new SparseIntArray();
}
private void initStyle(Context context, AttributeSet attrs){
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.ZTabLayout,0,0);
mNormalTextSize = typedArray.getDimensionPixelSize(R.styleable.ZTabLayout_tab_normal_textSize,DEFAULT_NORMAL_TEXT_SIZE_SP);
mSelectTextSize = typedArray.getDimensionPixelSize(R.styleable.ZTabLayout_tab_select_textSize,DEFAULT_SELECT_TEXT_SIZE_SP);
mTextColor = typedArray.getColorStateList(R.styleable.ZTabLayout_tab_textColor);
if(mTextColor==null)
mTextColor = createDefaultTextColor();
mIndicatorHeight = (int) typedArray.getDimension(R.styleable.ZTabLayout_tab_indicatorHeight,DEFAULT_INDICATOR_HEIGHT_DP);
mIndicatorColor = typedArray.getColor(R.styleable.ZTabLayout_tab_indicatorColor,DEFAULT_INDICATOR_COLOR);
mMinTabWidth = typedArray.getColor(R.styleable.ZTabLayout_tab_min_width,DEFAULT_TAB_MIN_WIDTH);
mDividerColor = typedArray.getColor(R.styleable.ZTabLayout_tab_dividerColor,DEFAULT_DIVIDER_COLOR);
mDividerWidth = (int) typedArray.getDimension(R.styleable.ZTabLayout_tab_dividerWidth,DEFAULT_DIVIDER_WIDTH);
mDividerPadding = (int) typedArray.getDimension(R.styleable.ZTabLayout_tab_dividerPadding,DEFAULT_DIVIDER_PADDING);
mTabPadding = (int) typedArray.getDimension(R.styleable.ZTabLayout_tab_Padding,0);
hasShowDivider = typedArray.getBoolean(R.styleable.ZTabLayout_tab_dividerShow,false);
typedArray.recycle();
}
private ColorStateList createDefaultTextColor(){
ColorStateList colorStateList = new ColorStateList(new int[][]{{android.R.attr.state_selected}
,{0}}, new int[]{DEFAULT_SELECT_TEXT_COLOR,DEFAULT_NORMAL_TEXT_COLOR});
return colorStateList;
}
public void setDataList(List<String> dataList){
this.mDataList.clear();
this.mDataList.addAll(dataList);
}
public void setupWithViewPager(ViewPager viewPager){
this.mViewPager = viewPager ;
if(viewPager == null)
throw new IllegalArgumentException("viewpager not is null");
PagerAdapter pagerAdapter = viewPager.getAdapter() ;
if(pagerAdapter == null)
throw new IllegalArgumentException("pagerAdapter not is null");
this.mViewPager.addOnPageChangeListener(new TabPagerChanger());
mTabCount = pagerAdapter.getCount();
mCurrentTabPosition = viewPager.getCurrentItem();
notifyDataSetChanged();
}
public void notifyDataSetChanged(){
mTabContainer.removeAllViews();
for (int i = 0 ; i<mTabCount;i++) {
final int currentPosition = i ;
TextView tabTextView = createTextView() ;
tabTextView.setPadding(mTabPadding,0,mTabPadding,0);
tabTextView.setText(mDataList.get(i));
tabTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mViewPager.setCurrentItem(currentPosition);
}
});
mTabContainer.addView(tabTextView,new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,1));
}
setSelectedTabView(mCurrentTabPosition);
}
private TextView createTextView(){
TextView textView = new TextView(getContext());
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,mNormalTextSize);
textView.setTextColor(mTextColor
没有合适的资源?快使用搜索试试~ 我知道了~
简单仿TabLayout实现个性化Tab,让Tab展现多样化
共101个文件
xml:37个
bin:16个
java:15个
3星 · 超过75%的资源 需积分: 33 59 下载量 6 浏览量
2016-09-25
19:41:27
上传
评论 1
收藏 1.66MB ZIP 举报
温馨提示
简单实现了类似网易新闻客户端Tab栏的效果,详细查看博客http://blog.csdn.net/Iamzgx/article/details/52663783
资源推荐
资源详情
资源评论
收起资源包目录
简单仿TabLayout实现个性化Tab,让Tab展现多样化 (101个子文件)
gradlew.bat 2KB
fileSnapshots.bin 5.22MB
fileSnapshots.bin 3.07MB
localClassSetAnalysis.bin 280KB
localClassSetAnalysis.bin 270KB
fileHashes.bin 153KB
fileHashes.bin 145KB
taskArtifacts.bin 123KB
taskArtifacts.bin 111KB
fileSnapshotsToTreeSnapshotsIndex.bin 27KB
localJarClasspathSnapshot.bin 23KB
outputFileStates.bin 20KB
localJarClasspathSnapshot.bin 20KB
localJarClasspathSnapshot.bin 19KB
localJarClasspathSnapshot.bin 19KB
localClassSetAnalysis.bin 18KB
localClassSetAnalysis.bin 18KB
.gitignore 105B
.gitignore 8B
build.gradle 854B
build.gradle 521B
settings.gradle 16B
gradlew 5KB
app.iml 11KB
TabDemo.iml 938B
gradle-wrapper.jar 52KB
ZTabLayout.java 14KB
IndicationTabLayout.java 4KB
MainActivity.java 4KB
AddChannelFragment.java 3KB
ChannelAdapter.java 3KB
SimpleItemTouchHelperCallback.java 2KB
TwoFragment.java 2KB
OneFragment.java 1KB
AppUtils.java 987B
TabApplication.java 427B
ApplicationTest.java 360B
LazyFragment.java 330B
ExampleUnitTest.java 324B
ItemTouchHelperAdapter.java 237B
ItemTouchHelperViewHolder.java 199B
localJarClasspathSnapshot.lock 17B
localClassSetAnalysis.lock 17B
localJarClasspathSnapshot.lock 17B
localClassSetAnalysis.lock 17B
localJarClasspathSnapshot.lock 17B
localClassSetAnalysis.lock 17B
cache.properties.lock 17B
localJarClasspathSnapshot.lock 17B
localClassSetAnalysis.lock 17B
cache.properties.lock 17B
ic_launcher.png 10KB
ic_launcher.png 8KB
ic_launcher.png 5KB
ic_launcher.png 3KB
ic_launcher.png 2KB
channel_close.png 432B
add_channel_icon.png 159B
proguard-rules.pro 657B
gradle.properties 872B
local.properties 423B
gradle-wrapper.properties 239B
cache.properties 31B
cache.properties 31B
workspace.xml 161KB
misc.xml 3KB
activity_simple_tab.xml 2KB
support_v4_24_0_0.xml 898B
attrs.xml 785B
fragment_channel_layout_item.xml 785B
recyclerview_v7_24_0_0.xml 774B
fragment_channel_layout.xml 764B
appcompat_v7_24_0_0.xml 756B
AndroidManifest.xml 725B
design_24_0_0.xml 720B
compiler.xml 686B
animated_vector_drawable_24_0_0.xml 640B
support_vector_drawable_24_0_0.xml 635B
gradle.xml 626B
cardview_v7_24_0_0.xml 575B
runConfigurations.xml 564B
hamcrest_core_1_3.xml 526B
library_2_4_0.xml 520B
activity_index.xml 501B
fragment_two.xml 495B
support_annotations_24_0_0.xml 485B
junit_4_12.xml 477B
fragment_one.xml 414B
styles.xml 392B
dimens.xml 364B
modules.xml 351B
colors.xml 333B
tab_title_selector.xml 304B
tab_text_color.xml 241B
divider_line_shape.xml 222B
dimens.xml 216B
chanel_move_bg.xml 190B
chanel_item_bg.xml 188B
encodings.xml 159B
profiles_settings.xml 76B
共 101 条
- 1
- 2
资源评论
- l5113290282018-05-30评论能获取积分吗
- qq_148301912018-05-28感谢分享 能正常使用
iGoach
- 粉丝: 99
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功