GithubHelp home page GithubHelp logo

kevalpatel2106 / android-ruler-picker Goto Github PK

View Code? Open in Web Editor NEW
389.0 389.0 89.0 3.65 MB

Android custom view that uses ruler for picking the number from given range.

Home Page: http://kevalpatel2106.com/

License: Apache License 2.0

Kotlin 21.78% Java 78.22%
android-library custom-view java kotlin-android number-picker ruler rulerview

android-ruler-picker's Introduction

Hi ๐Ÿ‘‹, I'm Keval Patel

I'm an Android engineer. That's right, I make apps for your phone.

๐Ÿ”ญ Iโ€™m currently working on Pocket CI where I'm experimenting new and exciting stuff from Android developement. ๐Ÿ‘ฏ Iโ€™m looking to collaborate on any open source Android project or Android libraries in need of maintainer.

GitHub Stats:

ย kevalpatel2106

๐Ÿ“ซ How to reach me:

kevalpatel2106 kevalpatel2106 kevalpatel2106

android-ruler-picker's People

Contributors

kevalpatel2106 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-ruler-picker's Issues

Indicator Size

How to resize indicator in this library? , I can not do that


Notch not being shown

Unable to see notch

StandUp Version: 'com.kevalpatel2106:ruler-picker:1.1'

Android Version: 9(pie)

Device Information: mi a2 (android one)

tried both of the following codes, my app is in androidx:

      RulerValuePicker picker =findViewById(R.id.ruler_picker);
      picker.selectValue(60);
      picker.setNotchColor(Color.RED);
      picker.setValuePickerListener(new RulerValuePickerListener() {
                @Override
                public void onValueChange(int selectedValue) {
                }
                @Override
                public void onIntermediateValueChange(int selectedValue) {
                }
       });
                

and

<com.kevalpatel2106.rulerpicker.RulerValuePicker
                    android:id="@+id/ruler_picker"
                    android:layout_width="match_parent"
                    android:layout_height="120dp"


                    app:indicator_color="@color/colorPrimary"
                    app:indicator_interval="10dp"
                    app:indicator_width="2dp"

                    app:max_value="1000"
                    app:min_value="35"
                    app:notch_color="@color/colorAccent"
                    app:ruler_text_size="6sp"

                    />

First and Last Position Need to add Long indicator with values

Hello

First and Last Position of Ruler need long indicator height with below text values.
for example if the min value is 10 and the maximum value is 30 then the ruler should start from 10 with long indicator and end with long indicator with value of 30. please help me to modify the library in that way.

Thank you,

Infinite value for the max_value

I want to scroll the item without any max_value number. then how can I set these?
I need to scroll the layout endless without any end point, and If there should be end point then last number of the Integer like Integer.MAX_VALUE.

Can anyone help on this?

New Idea

image

Please help me change modify some existing method to show text for diff time slots.

Thanks master

selectValue method isn't safe

so i've discovered that selectValue method isn't safe. If you call it multiple times in a row it will do some asynchroniuos way of setting value for each all which will eventually mess up the visible value (even if you're setting up the same value all the time).

Case of usage:

  1. onCreateView you setlectValue and rotate the screen.
  2. your onCreateView selectValue gets called and default selectValue from restoring state gets called
  3. in result if you wanted to set value 1 in range [0, 10] your final value will be 2, if it was 2 then final value will be 4

set value

how to set the value for the ruler form the edit text.
I had already set selected value on initialize.
I am having edit text to enter the value on focus changed the value for the ruler is not set instead it is adding the value to the old value.

Android Version:Android 8.1

Device Information:

  • MANUFACTURER: Emulator
  • BRAND:Google Nexus 5

Importing ruler fails with Unable to merge dex exception

trying to use the ruler, but getting build errors. I've added this line to gradle:
implementation 'com.kevalpatel2106:ruler-picker:1.0'

synct and tried to build, got the error:
Error:java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
Error:java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
Error:java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
Error:com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
Error:com.android.dex.DexException: Multiple dex files define Landroid/support/design/widget/CoordinatorLayout$ViewElevationComparator;
Information:BUILD FAILED in 19s

Then i tried to enable multidexing, syncing and rebuilding again. I've set in gradle:
multiDexEnabled true

And got the following error while trying to rebuild:
Error:java.lang.RuntimeException: java.io.IOException: Can't write [../app/build/intermediates/multi-dex/debug/componentClasses.jar] (Can't read [../app/build/intermediates/transforms/desugar/debug/35.jar(;;;;;;* .class)] (Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class]))
Error:java.io.IOException: Can't write [../app/build/intermediates/multi-dex/debug/componentClasses.jar] (Can't read [../app/build/intermediates/transforms/desugar/debug/35.jar(;;;;;;
*.class)] (Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class]))
Error:java.io.IOException: Can't read [../app/build/intermediates/transforms/desugar/debug/35.jar(;;;;;;**.class)] (Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class])
Error:java.io.IOException: Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class]

So some kind of dublicate zip entry... Removing implementation 'com.kevalpatel2106:ruler-picker:1.0' project compiles well... gonna try to investigate more...

Full error:
FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':app:transformClassesWithMultidexlistForDebug'.

java.io.IOException: Can't write [../app/build/intermediates/multi-dex/debug/componentClasses.jar] (Can't read [../app/build/intermediates/transforms/desugar/debug/35.jar(;;;;;;**.class)] (Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class]))

  • Try:
    Run with --info or --debug option to get more log output.

  • Exception is:
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithMultidexlistForDebug'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
    at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
    at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    Caused by: java.lang.RuntimeException: java.io.IOException: Can't write [../app/build/intermediates/multi-dex/debug/componentClasses.jar] (Can't read [../build/intermediates/transforms/desugar/debug/35.jar(;;;;;;* .class)] (Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class]))
    at com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55)
    at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:104)
    at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:213)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:173)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
    ... 27 more
    Caused by: java.io.IOException: Can't write [../app/build/intermediates/multi-dex/debug/componentClasses.jar] (Can't read [../app/build/intermediates/transforms/desugar/debug/35.jar(;;;;;;
    .class)] (Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class]))
    at proguard.OutputWriter.writeOutput(OutputWriter.java:187)
    at proguard.OutputWriter.execute(OutputWriter.java:79)
    at proguard.ProGuard.writeOutput(ProGuard.java:427)
    at proguard.ProGuard.execute(ProGuard.java:175)
    at com.android.build.gradle.internal.transforms.BaseProguardAction.runProguard(BaseProguardAction.java:61)
    at com.android.build.gradle.internal.transforms.MainDexListTransform.shrinkWithProguard(MainDexListTransform.java:232)
    at com.android.build.gradle.internal.transforms.MainDexListTransform.transform(MainDexListTransform.java:184)
    at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:222)
    at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:218)
    at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
    ... 39 more
    Caused by: java.io.IOException: Can't read [../app/build/intermediates/transforms/desugar/debug/35.jar(;;;;;;
    *.class)] (Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class])
    at proguard.InputReader.readInput(InputReader.java:188)
    at proguard.InputReader.readInput(InputReader.java:158)
    at proguard.OutputWriter.writeOutput(OutputWriter.java:176)
    ... 48 more
    Caused by: java.io.IOException: Duplicate zip entry [35.jar:android/support/design/widget/CoordinatorLayout$Behavior.class]
    at proguard.io.JarWriter.getOutputStream(JarWriter.java:138)
    at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:106)
    at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:106)
    at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:92)
    at proguard.io.ClassRewriter.read(ClassRewriter.java:68)
    at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
    at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
    at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
    at proguard.io.JarReader.read(JarReader.java:65)
    at proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65)
    at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53)
    at proguard.InputReader.readInput(InputReader.java:184)
    ... 50 more

Would be usefull to be able to label each step, not only every 5 steps

It would be nice to be flexible on "what to label" and "how often to label".
I've given untested pull request of the fix which allows to customise the interval for long indicator.
Customising it will allow not only to place every "X" a long interval, but will place a label as well.

Usefull when you have a small ruler and want to have every value shown. So you could chose X = 1 and have all values labeled :).

Looking towards your test / merge aproval and next release. Cheers!

Custom interval support [QUESTION/FEATURE]

** Custom interval for each hop**

Really cool lib, did I miss something but is there a way to define custom intervals between each point.

Seems to me like current hop is 1. What if I want it to be 5, 10 , 100, making the scroll much more manageable ? Or do you already have that in? and I missed it?

1.0
7.1
Device Information:

  • MANUFACTURER: MOTOROLA PLAY

onIntermediateValueChange gets called few times with same value

I've updated picker to 1.1 and i noticed that onIntermediateValueChange might be called a bit too often although it's value remains the same. Is it a desired functionality?

You can recreate this by having picker and two buttons: one to lower the value of the picker, another to rise it by 1. Picker limits are [1; 7]. Also we can notice a bit different behaviour while up / down are being pressed.

+extra: would be usefull to be able to label each step, not only every 5 steps =). Or every X steps.

        int counter = 3
         picker.selectValue(3);

        picker.setValuePickerListener(new RulerValuePickerListener() {
            @Override
            public void onValueChange(int x) {
                 counter = x;
                 displayNumber.setText(x);
            }

            @Override
            public void onIntermediateValueChange(int selectedValue) {
                displayNumber.setText(selectedValue );//get's a few calls with selectedValue being the same although we rise / lower by 1 
            }
        });

        down.setOnClickListener(v -> {
displayNumber.setText(counter - 1);
counter.selectValue(counter - 1); 
});
        up.setOnClickListener(v -> {
displayNumber.setText(counter +1);
counter.selectValue(counter + 1); 
});

my result gif: https://gph.is/2KR5hW1

RTL Support

is it possible to have the ruler from right to left?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.