2016-10-31 20 views
8

[EDIT] Giải pháp của @antonio hoạt động. Xem screeshots dưới đây để chứng minh ..Thư viện AndroidFillableLoaders của JorgeCastilloPrz - Vấn đề SVGPath


Tôi cố gắng để sử dụng Thư viện AndroidFillableLoaders JorgeCastilloPrz và đây là lần đầu tiên tôi đang sử dụng SVG (hoặc đường dẫn cho rằng vấn đề). Vì vậy, xin vui lòng chịu với tôi nếu câu hỏi là quá ngây thơ.

Thư viện 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> 

Tôi đang sử dụng chuỗi INDOMINOUS_REX từ các ứng dụng mẫu trong thư viện như con đường SVG. 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(); 

    } 

} 

Khi tôi chạy mã này, tôi nhận được những ngoại lệ sau đây:

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) 

Ai đó có thể giúp tôi trong figuring this out?


Các giải pháp công trình @antonio và đây là bằng chứng ...

enter image description here

enter image description here

enter image description here

+0

Cho rằng nó đang ném một NPE trong một phương thức được gọi là "parsePath()', bạn có chắc chắn rằng biến 'INDOMINUS_REX' không phải là null? Nếu không thì bạn đã cố gắng làm gì để gỡ lỗi nó? Ví dụ, bạn đã thử loại bỏ các phương thức từ chuỗi phương thức 'loaderBuilder' chưa? –

Trả lời

4

Các NPE xảy ra bởi vì bạn đã xác định một trong com.github.jorgecastillo.FillableLoaderR.layout.activity_splash của bạn nhưng bạn chưa đặt chương trình được tạo theo chương trình con đường. Từ the documentation

Để thiết lập đường dẫn được tạo ra bởi mã (làm điều đó chỉ nếu bạn tuyên bố FillableLoader trong cách bố trí xml):

fillableLoader.setSvgPath(String generatedSvgPath); 

Để giải quyết nó, onCreate bạn có thể là như thế này:

@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); 
} 

Lưu ý rằng bạn đã xác định FillableLoader cả trong bố cục và theo lập trình, nhưng định nghĩa đang gây ra NPE là một trong bố cục bởi vì nó thiếu setSvgPath.


tùy chọn khác là loại bỏ những định nghĩa FillableLoader từ cách bố trí của bạn khi bạn đang lập trình tạo ra nó bằng cách sử dụng 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> 

phương pháp SplashActivity.onCreate

@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); 
} 

Lưu ý rằng trong cả hai trường hợp, bạn sẽ cần phải gọi fillableLoader.start(); để xem phim hoạt hình.

+0

Xin lỗi vì đã nhận được tiền thưởng. Nó hoạt động .. Cảm ơn –

Các vấn đề liên quan