net.lucode.hackware.magicindicator使用及修改

本文介绍如何修改net.lucode.hackware.magicindicator库中的标题布局,以实现更灵活的文字位置控制。通过继承ColorTransitionPagerTitleView并重写init方法,解决了默认左边距问题,并通过反射获取所有标题View。
部署运行你感兴趣的模型镜像

net.lucode.hackware.magicindicator打造万能指示器。
相关文章已经有很多,且具体可以下载源码阅读。
今天遇上的问题是使用标题位置的修改,使用的标题view是ColorTransitionPagerTitleView,它的父类是SimplePagerTitleView,其中关于文字位置部分的在init方法中,但这个方法时private,就是说无法修改,他设置左右边距,即便设置LEFT,依旧会出现左边的一个边距,项目中不能有这个边距。所有改了源码

protected void init(Context context) {
        setGravity(Gravity.CENTER);
        int padding = UIUtil.dip2px(context, 10);
        setPadding(padding, 0, padding, 0);
        setSingleLine();
        setEllipsize(TextUtils.TruncateAt.END);
    }

对其扩展:
* -设置标题位置居左
*/

public class ColorMagicTitleView extends ColorTransitionPagerTitleView {

public ColorMagicTitleView(Context context) {
    super(context);
}

@Override
protected void init(Context context) {
    setGravity(Gravity.LEFT);
    int padding = UIUtil.dip2px(context, 10);
    setPadding(0, 0, padding, 0);
    setSingleLine();
    setEllipsize(TextUtils.TruncateAt.END);
}

}
中间发现一个当我想要获取所有的标题view的时候,没有提供getter方法,即private LinearLayout mTitleContainer;成员变量,所以只能使用反射了,拿到代码的小伙伴也可以添加getter方法。

/**
     * 获取所有的标题
     * @param commonNavigator
     */
    private void getIndicatorTitleContainer(CommonNavigator commonNavigator){
        Class clazz = commonNavigator.getClass();
        Field[] attrFieldes = clazz.getDeclaredFields();
        Object container = null;
        for (Field zField : attrFieldes) {
            zField.setAccessible(true);
            Log.d("IndicatorTitleContainer", "Field name -->" + zField.getName());
            if (zField.getName().contains("mTitleContainer")) {
                try {
                    container = zField.get(commonNavigator);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } finally {
                    break;
                }
            }
        }
        if (container != null && container instanceof LinearLayout){
            LinearLayout mLinearLayout = (LinearLayout) container;
            for (int i=0; i < mLinearLayout.getChildCount(); i++){
                SimplePagerTitleView mSimplePagerTitleView = (SimplePagerTitleView) mLinearLayout.getChildAt(i);
                commonNavigators.add(mSimplePagerTitleView);
            }
        }
    }

这个指示器很不错,推荐替换tablayout等控件。

您可能感兴趣的与本文相关的镜像

Facefusion

Facefusion

AI应用

FaceFusion是全新一代AI换脸工具,无需安装,一键运行,可以完成去遮挡,高清化,卡通脸一键替换,并且Nvidia/AMD等显卡全平台支持

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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="match_parent" android:layout_height="match_parent" android:background="@drawable/ld_bg" android:orientation="vertical" tools:context=".ui.main.activity.MainActivity"> <com.lingdong.fenkongjian.view.NoScrollViewPager android:id="@+id/mainViewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_above="@+id/tab_rl" android:background="#ABABAB" /> <RelativeLayout android:id="@+id/tab_rl" android:layout_width="match_parent" android:layout_height="60dp" android:layout_alignParentBottom="true"> <net.center.blurview.ShapeBlurView android:layout_width="match_parent" android:layout_height="match_parent" app:blur_down_sample="4" app:blur_overlay_color="#CCFFFFFF" app:blur_mode="rectangle" /> <net.lucode.hackware.magicindicator.MagicIndicator android:id="@+id/main_bottom_tab" android:layout_width="match_parent" android:layout_height="60dp" /> </RelativeLayout> <!-- <View--> <!-- android:id="@+id/zhezhaoView"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent"--> <!-- android:clickable="true"--> <!-- android:visibility="gone" />--> </RelativeLayout>怎么修改内容可以透过底部导航,并且滑动到最底部时不会遮挡内容
12-04
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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="match_parent" android:layout_height="match_parent" android:background="@drawable/ld_bg" android:orientation="vertical" tools:context=".ui.main.activity.MainActivity"> <com.lingdong.fenkongjian.view.NoScrollViewPager android:id="@+id/mainViewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_above="@+id/tab_rl" android:background="#ABABAB" /> <RelativeLayout android:id="@+id/tab_rl" android:layout_width="match_parent" android:layout_height="60dp" android:layout_alignParentBottom="true"> <net.center.blurview.ShapeBlurView android:layout_width="match_parent" android:layout_height="match_parent" app:blur_radius="@dimen/dp_10" app:blur_down_sample="4" app:blur_overlay_color="#CCFFFFFF" app:blur_mode="rectangle" /> <net.lucode.hackware.magicindicator.MagicIndicator android:id="@+id/main_bottom_tab" android:layout_width="match_parent" android:layout_height="60dp" /> </RelativeLayout> <View android:id="@+id/zhezhaoView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:visibility="gone" /> </RelativeLayout>怎么让fragment透过底部导航,并且页面滑动到最底部时底部导航不会遮挡fragment
12-04
要在 Android 布局中实现让 Fragment 透过底部导航,且页面滑到最底部时底部导航不遮挡 Fragment,可以采用以下几种方法: ### 调整布局结构 可以将 `RelativeLayout` 作为根布局,把 `NoScrollViewPager` 放置在顶部,`MagicIndicator` 放在底部。同时,为 `NoScrollViewPager` 设置合适的 `layout_marginBottom`,保证底部导航栏不会遮挡内容。示例代码如下: ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.viewpager.widget.NoScrollViewPager android:id="@+id/noScrollViewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="50dp" /> <!-- 设置底部边距,避免被底部导航栏遮挡 --> <net.lucode.hackware.magicindicator.MagicIndicator android:id="@+id/magicIndicator" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" /> </RelativeLayout> ``` ### 使用 CoordinatorLayout 和 AppBarLayout 如果需要实现更加复杂的滚动效果,可以使用 `CoordinatorLayout` 和 `AppBarLayout` 来协调滚动行为。示例代码如下: ```xml <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.viewpager.widget.NoScrollViewPager android:id="@+id/noScrollViewPager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <net.lucode.hackware.magicindicator.MagicIndicator android:id="@+id/magicIndicator" android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" /> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 在上述代码中,`app:layout_behavior="@string/appbar_scrolling_view_behavior"` 可以让 `NoScrollViewPager` 与 `MagicIndicator` 进行滚动协调。 ### 动态调整布局 在代码中动态调整 `NoScrollViewPager` 的高度,确保底部导航栏不会遮挡内容。示例代码如下: ```java import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager.widget.NoScrollViewPager; import net.lucode.hackware.magicindicator.MagicIndicator; public class MainActivity extends AppCompatActivity { private NoScrollViewPager noScrollViewPager; private MagicIndicator magicIndicator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); noScrollViewPager = findViewById(R.id.noScrollViewPager); magicIndicator = findViewById(R.id.magicIndicator); // 获取 MagicIndicator 的高度 int magicIndicatorHeight = magicIndicator.getHeight(); // 动态设置 NoScrollViewPager 的高度 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) noScrollViewPager.getLayoutParams(); params.height = getWindowManager().getDefaultDisplay().getHeight() - magicIndicatorHeight; noScrollViewPager.setLayoutParams(params); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值