可变长度的刻度尺

2024-08-31 06:08
文章标签 长度 可变 刻度尺

本文主要是介绍可变长度的刻度尺,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看效果图

  1.先讲下思路,先用xml写单个刻度然后用适配器加载,并设置刻

   1. xml 

   ruler_unit_horizontal.xml  
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00000000">

    <FrameLayout
        android:id="@+id/ruler_frame"
        android:layout_width="@dimen/dimen_dp_20"
        android:layout_height="@dimen/dimen_dp_25"
        android:paddingBottom="@dimen/dimen_dp_4"
        android:orientation="vertical">

        <TextView
            android:id="@+id/ruler_num"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:paddingBottom="@dimen/dimen_dp_4"
            android:text="250"
            android:textColor="@color/white"
            android:textSize="@dimen/dimen_sp_6" />

        <LinearLayout
            android:id="@+id/ruler_linear"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|bottom"
            android:orientation="horizontal">

            <View
                android:id="@+id/ruler_img"
                android:layout_width="@dimen/dimen_dp_1"
                android:layout_height="@dimen/dimen_dp_7"
                android:layout_gravity="bottom|center_horizontal"
                android:background="@color/white"
                android:scaleType="fitXY" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|right">

            <View
                android:layout_width="@dimen/dimen_dp_1"
                android:layout_height="@dimen/dimen_dp_4"
                android:layout_gravity="bottom"
                android:background="@color/white"
                android:scaleType="fitXY" />
        </LinearLayout>
    </FrameLayout>

</RelativeLayout>
2.适配器    
    RulerAdapter
public class RulerAdapter extends RecyclerView.Adapter<RulerAdapter.RulerViewHolder> {private String TAG = "RulerAdapter";public void setList(int list) {this.list = list;notifyDataSetChanged();}private int list = 350;private Context context;private int width;public RulerAdapter(Context context) {this.context = context;}@Override
    public RulerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.ruler_unit_horizontal, null);return new RulerViewHolder(view);}@Override
    public void onBindViewHolder(RulerViewHolder holder, int position) {TextView tv = holder.numberView;View view = holder.rulerView;FrameLayout frameLayout = holder.frameLayout;if (frameLayout != null) {if (position == 0) {tv.setText(0 + "");}else {float number=(float)position*5/10;tv.setText(number+"");}}}@Override
    public int getItemCount() {return list;}class RulerViewHolder extends RecyclerView.ViewHolder {TextView numberView;View rulerView;FrameLayout frameLayout;public RulerViewHolder(View arg0) {super(arg0);numberView = (TextView) arg0.findViewById(R.id.ruler_num);rulerView = (View) arg0.findViewById(R.id.ruler_img);frameLayout = (FrameLayout) arg0.findViewById(R.id.ruler_frame);}}
}
3.
  自定义 RecyclerView
public class RulerView extends RecyclerView {private static final String TAG = "RulerView";RulerViewListener rulerViewListener = null;@Override
    public RulerAdapter getAdapter() {return adapter;}RulerAdapter adapter;public void setRulerViewListener(RulerViewListener rulerViewListener) {this.rulerViewListener = rulerViewListener;}public interface RulerViewListener {void onScrollChanged(int l, int t);/**
         * 是否拖拽
         * @param isDraggingMove
         */
        void  stateChanged(boolean isDraggingMove);}public RulerView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);if (!isInEditMode()) {TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RulerView);setLayoutParams(new LayoutParams(1000, LayoutParams.MATCH_PARENT));ta.recycle();init(context);}addScrollListener();}LinearLayoutManager manager;private void init(Context context) {manager = new LinearLayoutManager(context);manager.setOrientation(LinearLayoutManager.HORIZONTAL);setLayoutManager(manager);adapter = new RulerAdapter(context);setAdapter(adapter);manager.scrollToPositionWithOffset(0, 0);}public void scrollToOffset(int x, int y) {if (x<0) {return;}Log.d(TAG, "child scrollToOffset dx: " +x +"-dy-->"+y);manager.scrollToPositionWithOffset(x,y);}@Override
    public void onScrollStateChanged(int state) {super.onScrollStateChanged(state);if (state==SCROLL_STATE_DRAGGING) {rulerViewListener.stateChanged(true);}else {rulerViewListener.stateChanged(false);}}@Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);//  l=getDistance();
       // rulerViewListener.onScrollChanged(l,t);
        Log.d(TAG, "child onScrollChanged dx: " +l +"-dy-->"+t);}//记录滚动的总距离,类似view中的mScrollX和mScrollY
    private int sx = 0, sy = 0;//自己定义的滚动监听接口
    public interface RecyclerScrollChangeListener{void ScrollChange(int y);}private RecyclerScrollChangeListener mScrollListener = null;//重写scrollTo方法,通过内部的scrollBy实现scrollTo的功能
    @Override
    public void scrollTo(int x, int y) {super.scrollTo(x, y);//计算滚动的相对距离,通过传进来的x和当前的sx差值就是scrollBy需要滚动的值
        scrollBy(x - sx, y - sy);}private void addScrollListener(){addOnScrollListener(new OnScrollListener() {@Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {//因为dx和dy是相对上次的滚动距离,所以通过一开始的累加可以得到总的sx和sy
                sx += dx;sy += dy;super.onScrolled(recyclerView, dx, dy);rulerViewListener.onScrollChanged(sx,sy);//此处如果有需要监听滚动变化的话在这回调
                Log.d(TAG, "child onScrollChanged dx: " +sx +"-dy-->"+sy);}});}}


4. 使用
直接在对应的veiw中添加即可
<skill.example.com.skillcreator.skill.view.rulerview.RulerView
    android:id="@+id/skill_rulerview"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dimen_dp_22"
    android:background="#00000000" />


5.扩展与使用
根据个人项目的应用场景对其进行修改,如xml中一个刻度单元长度进行设置,并且增加小刻度个数,刻度位置等,
并且在代码中动态设置刻度尺的长度,监听当前滑动位置等





这篇关于可变长度的刻度尺的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123098

相关文章

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

Java应用对接pinpoint监控工具的时候,应用名称长度超出限制而导致接入失败

一、背景 java应用需要接入pinpoint,同一个虚拟机上的其他应用接入成功,唯独本应用不行。 首先排除是pinpoint agent的问题,因为其他应用都正常。 然后,我就对比二者的启动脚本。 -javaagent:/opt/pinpoint/pinpoint-bootstrap.jar -Dpinpoint.agentId=DA301004_17 -Dpinpoint.applic

2300年都无人能知有长度不同的伪≌射线

黄小宁 【摘要】自有射线概念后的2300年里一直无人能知有长度不同的射线。保距变换和≌图概念是能放大无穷大倍的思维望远镜使人能一下子看到有长度不同的伪重合、伪≌射线。 变量x所取各数也均由x代表,x代表其变域(x所有能取的数组成的集)内任一元。设集A={x}表A各元均由x代表,{x}中变量x的变域是A。其余类推。“实数集”R所有非负元x≥0组成R+={x≥0},这里的x≥0不是表示x可取一切非负

MQTT协议中信息长度MSG len字段分析

截图自: 主要是说数据字节长度的计算: 每个字节由1个持续位和7个数据位组成:如果持续位为1,表示接下来的一个字节仍然表示长度的一部分 7个数据位表示的数据     0-127   共计128个数字 所以如上图的表格所示 1个字节,2个字节,3个字节,4个字节的数据范围 切记:MQTT长度的表示范围 最多使用4个字节  故这里存在着数据长度的限制  (不过真心牛掰! 试试Q

EL表达式获取List集合长度

有一次在jsp页面我要获取后台的一个list集合的长度,当然你可以在后台保存长度然后在页面获取,这是一种方法,现在我介绍另一种方法: 首先:我们在jsp页面导入jstl标签库<%@ taglib prefix="fn" uri="http://java.sun.com/jsp.jstl/functions"%> 然后在你要获取的地方写上:${fn:length(qunarRemarkList)

C++11,可变参数模板,lambda表达式,包装器

可变参数模板 在C++11中模板也可以接收多个不定参数,就和int printf(const char *format, ...);函数一般模板也可以接收多个参数; // 可变参数模板template<class ...Args>void testArgs(Args... args){}int main(){testArgs(123, 'a', "abc",

mysql数据库中的字符串长度函数:LENGTH() 与 CHAR_LENGTH()

在数据库管理系统中,处理字符串数据时,了解字符串的长度是一个常见且重要的需求。无论是为了数据验证、格式化输出,还是在进行复杂的查询操作中,准确获取字符串的长度都是必不可少的。SQL标准提供了几种函数来帮助我们实现这一目标,其中LENGTH()和CHAR_LENGTH()是两个常被提及的函数,尽管它们在某些数据库系统中可能表现出相似的行为,但在一些细节上存在差异。本文将深入探讨这两个函数的用法及其区

计算两个字符串的最大公共字符串的长度,字符不区分大小写

/*** */package testString;import java.util.Scanner;/***@author: Administrator*@date: 2016-12-28 下午01:08:30*/public class Main {public static void main(String[] args){Scanner sc=new Scanner(Syste

【滑动窗口】| 力扣高频题: 长度最小的数组

🎗️ 主页:小夜时雨 🎗️专栏:算法题 🎗️如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/minimum-size-subarray-sum/description/ (可点击) 本道题是滑动窗口的一道经典应用问题:找出数组中长度最小的子数组。 滑动窗口优化思

力扣209:长度最小的数组

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件