Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JorgeCastilloPrz's AndroidFillableLoaders Library - SVGPath issue

Tags:

java

android

svg

[EDIT] The solution of @antonio works. See the screeshots below for proof..


I am trying to use JorgeCastilloPrz's AndroidFillableLoaders Library and this is the first time i am using SVG(or Path for that matter). So please bear with me if the question is too naive.

Library Link: https://github.com/JorgeCastilloPrz/AndroidFillableLoaders

Code:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/rl_root_splash_activity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/splash_screen_color_1"
    android:paddingBottom="100dp"
    android:paddingEnd="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingStart="16dp">

<com.github.jorgecastillo.FillableLoader
        android:id="@+id/fillableLoader"
        android:layout_width="200dp"
        android:layout_height="100dp"
        app:fl_clippingTransform="waves"
        app:fl_fillColor="#1c9ade"
        app:fl_fillDuration="5000"
        app:fl_originalHeight="970"
        app:fl_originalWidth="970"
        app:fl_strokeColor="#1c9ade"
        app:fl_strokeDrawingDuration="2000"
        app:fl_strokeWidth="16dp" />

</RelativeLayout>

I am using the INDOMINOUS_REX string from the sample app in library as the SVG Path. Link: https://github.com/JorgeCastilloPrz/AndroidFillableLoaders/blob/master/sampleapp/src/main/java/com/github/jorgecastillo/Paths.java

MainActivity.java

public class SplashActivity extends AppCompatActivity {

    RelativeLayout rlRoot;
    FillableLoader fillableLoader;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        rlRoot = (RelativeLayout) findViewById(R.id.rl_root_splash_activity);

        FillableLoaderBuilder loaderBuilder = new FillableLoaderBuilder();
        fillableLoader = loaderBuilder
                .parentView(rlRoot)
                .svgPath(Const.Paths.INDOMINUS_REX)
                .layoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT))
                .originalDimensions(970, 970)
                .strokeColor(Color.parseColor("#1c9ade"))
                .fillColor(Color.parseColor("#1c9ade"))
                .strokeDrawingDuration(2000)
                .clippingTransform(new WavesClippingTransform())
                .fillDuration(10000)
                .build();

    }

}

When i run the code, i get the following exception:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
                                                       at com.github.jorgecastillo.svg.SvgPathParser.parsePath(SvgPathParser.java:52)
                                                       at com.github.jorgecastillo.FillableLoader.buildPathData(FillableLoader.java:374)
                                                       at com.github.jorgecastillo.FillableLoader.onSizeChanged(FillableLoader.java:224)
                                                       at android.view.View.sizeChange(View.java:16748)
                                                       at android.view.View.setFrame(View.java:16710)
                                                       at android.view.View.layout(View.java:16627)
                                                       at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
                                                       at android.view.View.layout(View.java:16630)
                                                       at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                       at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                       at android.view.View.layout(View.java:16630)
                                                       at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                       at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                       at android.view.View.layout(View.java:16630)
                                                       at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                       at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                       at android.view.View.layout(View.java:16630)
                                                       at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                       at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                       at android.view.View.layout(View.java:16630)
                                                       at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                       at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                       at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
                                                       at android.view.View.layout(View.java:16630)
                                                       at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171)
                                                       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931)
                                                       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
                                                       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
                                                       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
                                                       at android.view.Choreographer.doCallbacks(Choreographer.java:670)
                                                       at android.view.Choreographer.doFrame(Choreographer.java:606)
                                                       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
                                                       at android.os.Handler.handleCallback(Handler.java:739)
                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                       at android.os.Looper.loop(Looper.java:148)
                                                       at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Can someone help me in figuring this out?


The solution of @antonio works and here is the proof...

enter image description here

enter image description here

enter image description here

like image 649
Vamsi Challa Avatar asked Oct 31 '16 04:10

Vamsi Challa


1 Answers

The NPE occurs because you have defined a com.github.jorgecastillo.FillableLoader in your R.layout.activity_splash but you haven't programmatically set the generated path. From the documentation

To set the generated path by code (do it just if you declared FillableLoader in the xml layout):

fillableLoader.setSvgPath(String generatedSvgPath);

To solve it, your onCreate can be like this:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    rlRoot = (RelativeLayout) findViewById(R.id.rl_root_splash_activity);

    fillableLoader = (FillableLoader) findViewById(R.id.fillableLoader);
    fillableLoader.setSvgPath(Const.Paths.INDOMINUS_REX);
}

Note that you have defined a FillableLoader both in your layout and programmatically, but the definition that is causing the NPE is the one in the layout because it lacks the setSvgPath.


Other option is removing the FillableLoader definition from your layout as you are programmatically generating it using a FillableLoaderBuilder:

activity_splash.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/rl_root_splash_activity"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/splash_screen_color_1"
            android:paddingBottom="100dp"
            android:paddingEnd="16dp"
            android:paddingLeft="16dp"
            android:paddingRight="16dp"
            android:paddingStart="16dp">
</RelativeLayout>

SplashActivity.onCreate method

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    rlRoot = (RelativeLayout) findViewById(R.id.rl_root_splash_activity);

    FillableLoaderBuilder loaderBuilder = new FillableLoaderBuilder();
    fillableLoader = loaderBuilder
            .parentView(rlRoot)
            .svgPath(Const.Paths.INDOMINUS_REX)
            .layoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT))
            .originalDimensions(970, 970)
            .strokeColor(Color.parseColor("#1c9ade"))
            .fillColor(Color.parseColor("#1c9ade"))
            .strokeDrawingDuration(2000)
            .clippingTransform(new WavesClippingTransform())
            .fillDuration(10000)
            .build();
    fillableLoader.setSvgPath(Paths.INDOMINUS_REX);
}

Note that in both cases you will need to call fillableLoader.start(); to see the animation.

like image 125
antonio Avatar answered Oct 01 '22 15:10

antonio