Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

指示器无法与文字对齐 #34

Open
Heart-Beats opened this issue May 17, 2022 · 14 comments
Open

指示器无法与文字对齐 #34

Heart-Beats opened this issue May 17, 2022 · 14 comments
Assignees
Labels
help wanted Extra attention is needed 需求

Comments

@Heart-Beats
Copy link

大佬您好,我的 tab布局如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingEnd="@dimen/dp_30"
    android:paddingBottom="@dimen/sp_6">


    <com.zhengsr.tablib.view.TabColorTextView
        android:id="@+id/item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="start"
        android:textSize="@dimen/sp_9"
        app:colortext_change_color="@color/color_595cca"
        app:colortext_default_color="@color/color_6f718f"
        tools:text="测试" />


</FrameLayout>

整个tab 设置属性如下:

            <com.zhengsr.tablib.view.flow.TabVpFlowLayout
                android:id="@+id/rectflow"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tab_action_orientaion="left"
                app:tab_width_equals_text="true"
                app:tab_color="@color/colorPrimary"
                app:tab_type="rect" />

最终显示的效果却如下:
image

无论我怎么设置 tab布局 中的 paddingEnd 或者 marginEnd,始终都达不到想要的效果,现在除了想到写死宽度,在设置指示器的宽度,没想到好的方法

@LillteZheng
Copy link
Owner

用demo试试

@Heart-Beats
Copy link
Author

image
大佬还是和上次一样的问题,tab 使用 TabColorTextView 选中后渲染有问题,TabVpFlowLayout 设置如下:

            <com.zhengsr.tablib.view.flow.TabVpFlowLayout
               android:id="@+id/order_detail_tab_flow"
               android:layout_width="@dimen/dp_198"
               android:layout_height="wrap_content"
               app:tab_height="@dimen/dp_2"
               app:tab_visual_count="3"
               app:tab_width_equals_text="true"
               app:tab_item_res="@drawable/shape_round2_gradient_ff9295e7_ff595cca"
               app:tab_type="res" />
              ```
              
              其中自定义了一个 ResAction,因为默认的 ResAction
设置指示器高度有问题,尝试使用Textview 重写  TabFlowAdapter 
的 onItemSelectState 方法设置文字颜色,但是发现点击时该方法无回调,因此希望大佬可以看下这两个问题:


1.  TabColorTextView  文字渲染有问题
2. TabFlowAdapter  的 onItemSelectState 无事件回调

@LillteZheng
Copy link
Owner

用demo 试了吗?

@Heart-Beats
Copy link
Author

我拿 demo 简单修改了一下,可以复现提到的两个问题:
截图如下:
Screenshot_20220627_142211_com zhengsr tabhelper
修改部分代码如下:

    private void resFlow() {
        final TabVpFlowLayout flowLayout = findViewById(R.id.resflow);

        /**
         * 配置自定义属性
         */

        TabBean bean = new TabBean();
        bean.tabType = FlowConstants.RES;
        bean.tabItemRes = R.drawable.shape_round;
        bean.tabClickAnimTime = 300;
        // bean.tabMarginLeft = 30;
        bean.tabMarginTop = 12;
        bean.tabMarginRight = 5;
        bean.tabMarginBottom = 10;
        bean.autoScale = true;
        bean.scaleFactor = 1.2f;
        // bean.selectedColor = Color.RED;
        bean.tabHeight = 20;
        // bean.unSelectedColor = getResources().getColor(R.color.unselect);
        flowLayout.setTabBean(bean);

        TabConfig config = new TabConfig.Builder()
                .setViewpager(mViewPager)
                .setTextId(R.id.item_text)
                .build();
        flowLayout.setTabConfig(config);
        // flowLayout.setCusAction(new MyResAction());

        flowLayout.setAdapter(config, new TabFlowAdapter<String>(R.layout.item_my_test, mTitle) {

            @Override
            public void onItemSelectState(View view, boolean isSelected) {
                super.onItemSelectState(view, isSelected);
                Log.d(TAG, "onItemSelectState: isSelect == " + isSelected);
            }

            @Override
            public void bindView(View view, String data, int position) {
                setText(view, R.id.item_text, data);
            }

        });
    }

item_my_test文件如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.zhengsr.tablib.view.TabColorTextView

        android:id="@+id/item_text"
        android:layout_width="match_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="30dp"
        tools:text="测试"
        android:paddingTop="6dp"
        android:paddingBottom="6dp" android:textSize="18sp"
        android:gravity="center"
        app:colortext_default_color="@color/white"
        app:colortext_change_color="#FF0000"
        android:textColor="@color/unselect"
        android:layout_height="wrap_content"/>
</FrameLayout>

主要就是去除了 TabColorTextView 的 左右 padding, 然后加上 marginEnd 后就渲染异常了,还有 onItemSelectState 点击事件的生效时机好像时间隔三个切换才生效,而且给的状态里我看有两个 true。

而且希望大佬优化一下 ResAction 的默认绘制,因为现在的方式不取 tabHeight,导致使用 Res 形式的一定填充满整个 tab ,但有时需求却是有点像 rect这种形式支持渐变 shape 的, 所以希望大佬优化一下这块的绘制处理,我之前重写了 config 方法如下:

	override fun config(parentView: AbsFlowLayout) {
		super.config(parentView)
		if (mRes != -1) {
			mDrawable = AppCompatResources.getDrawable(mContext, mRes)
		}
		val child = parentView.getChildAt(0)
		if (child != null) {
			if (mDrawable != null) {
				val width = child.measuredWidth
				val height = child.measuredHeight

				mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
				// 默认创建一个占满整个 view 的画布
				val canvas = Canvas(mBitmap)

				val l = (mTabBean.tabMarginLeft + child.left).toFloat()
				val t = (mTabBean.tabMarginTop + child.top).toFloat()
				val r = (child.right - mTabBean.tabMarginRight).toFloat()
				val b = (child.bottom - mTabBean.tabMarginBottom).toFloat()

				//这里更改原有的绘制高度和位置
				mDrawable!!.setBounds(0, height - mTabBean.tabHeight, width, height)
				mDrawable!!.draw(canvas)
				mTabRect.set(l, t, r, b)
				mSrcRect = Rect(0, 0, width, height)
			}
		}
	}

当有 tabHeight 时满足需求,但是没设置 tabHeight 时就没绘制出来,具体原因也就没细查下去了。

@LillteZheng
Copy link
Owner

我还是没理解你的需求:
你的需求时 res 类型下,不需要 res 填充整个高度?然后拿不到 TabBean 的 mTabheight?
目前 res 是根据子控件自身的大小去绘制的,如果你拿不到 mTabheight ,用 child.measuredHeight 也是能拿到高度才对

@Heart-Beats
Copy link
Author

需求就是如下图这样:
image

指示器是个渐变的 shape, 同时并不填充满整个高度,所以需要 ResAction 支持自定义指示器的高度

@LillteZheng
Copy link
Owner

明白了,我看你已经实现了呀。
设置tabheight?然后通过TabBean.tabHeight 去绘制 res 的大小?或者通过 child.measuredHeight 拿到也可以把。

@Heart-Beats
Copy link
Author

嗯,ResAction 的指示器高度自定义我已简单实现了,所以这个是希望大佬默认支持一下,这个 issue 主要是针对我反馈的两个问题:

  1. TabColorTextView 文字渲染有问题
  2. TabFlowAdapter 的 onItemSelectState 无事件回调

希望大佬有事件可以看一下

@LillteZheng
Copy link
Owner

  1. TabColorTextView 渲染,是因为demo有比较多滑动和动画,阻塞了;单个是没问题的,我们自己的项目也在用,压测过的。
  2. onItemSelectState 这个是非 viewpager 再回回调,后面再去掉它。
    感谢反馈

@Heart-Beats
Copy link
Author

  1. TabColorTextView 渲染,是因为demo有比较多滑动和动画,阻塞了;单个是没问题的,我们自己的项目也在用,压测过的。
  2. onItemSelectState 这个是非 viewpager 再回回调,后面再去掉它。
    感谢反馈

TabColorTextView 渲染的问题并不是由于多个阻塞的,可以看下图:
6d410e4171246cf69733b66c2b7e6c74

仅有单条时也会产生,可以使用如下代码进行复现:

    private void resFlow() {
        final TabVpFlowLayout flowLayout = findViewById(R.id.resflow);

        /**
         * 配置自定义属性
         */

        TabBean bean = new TabBean();
        bean.tabType = FlowConstants.RES;
        bean.tabItemRes = R.drawable.shape_round;
        bean.tabClickAnimTime = 300;
        // bean.tabMarginLeft = 30;
        bean.tabMarginTop = 12;
        bean.tabMarginRight = 5;
        bean.tabMarginBottom = 10;
        bean.autoScale = true;
        bean.scaleFactor = 1.2f;
        // bean.selectedColor = Color.RED;
        bean.tabHeight = 20;
        // bean.unSelectedColor = getResources().getColor(R.color.unselect);
        flowLayout.setTabBean(bean);

        TabConfig config = new TabConfig.Builder()
                .setViewpager(mViewPager)
                .setTextId(R.id.item_text)
                .build();
        flowLayout.setTabConfig(config);
        // flowLayout.setCusAction(new MyResAction());

        flowLayout.setAdapter(config, new TabFlowAdapter<String>(R.layout.item_my_test, mTitle) {

            @Override
            public void onItemSelectState(View view, boolean isSelected) {
                super.onItemSelectState(view, isSelected);
                Log.d(TAG, "onItemSelectState: isSelect == " + isSelected);
            }

            @Override
            public void bindView(View view, String data, int position) {
                setText(view, R.id.item_text, data);
            }

        });
    }

item_my_test文件如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.zhengsr.tablib.view.TabColorTextView
        android:id="@+id/item_text"
        android:layout_width="match_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="30dp"
        tools:text="测试"
        android:paddingTop="6dp"
        android:paddingBottom="6dp" android:textSize="18sp"
        android:gravity="center"
        app:colortext_default_color="@color/white"
        app:colortext_change_color="#FF0000"
        android:textColor="@color/unselect"
        android:layout_height="wrap_content"/>
</FrameLayout>

主要复现关键点在 TabColorTextView 中横向边距仅使用了 layout_marginEnd 这个属性,大佬可以使用此进行复现看看。

@LillteZheng
Copy link
Owner

好的,国庆后看看

@LillteZheng LillteZheng reopened this Sep 21, 2022
@zhaoxiuyu
Copy link

@LillteZheng 期待国庆后解决,刚看你的Demo,确实是歪的。
image

@LillteZheng
Copy link
Owner

认真看了这个问题,原来是使用了 layout_marginEnd 或layout_marginStart ,这个偏移量的意思,就是为了让用户可以决定偏移量。
demo 也是故意设置的,因为我们的apk 也有这种需求,所以加上的。
这个不是 bug,是故意为之。如果要对齐,把 layout_marginEnd 或 layout_marginStart 设置为0,或者大小一致即可@zhaoxiuyu @Heart-Beats

@LillteZheng
Copy link
Owner

LillteZheng commented Oct 11, 2022

目前文字对齐只支持 rect 哈,其他模式暂不支持
v1.37 : 增加 tab_width_equals_text ,让 rect 根据 text 的长度变化,修复 TabColorTextView 加粗不起作用的问题。

这个当做需求来看

@LillteZheng LillteZheng reopened this Oct 11, 2022
@LillteZheng LillteZheng added the help wanted Extra attention is needed label Oct 11, 2022
@LillteZheng LillteZheng self-assigned this Oct 11, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed 需求
Projects
None yet
Development

No branches or pull requests

3 participants