Steve C.
Steve C.

Reputation: 1353

Issue with circular reveal and CircularRevealLibrary in Android

I was following this tutorial to the "T" but when I run the app I get the following message in the logcat. I'm not sure what is going wrong because the class should be there right?

Could not find method android.view.ViewAnimationUtils.createCircularReveal, referenced from method io.codetail.animation.ViewAnimationUtils.createCircularReveal

MainActivity:

    import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.Filter;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.curtrostudios.testapp.network.AppConfig;

import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;
import io.codetail.animation.SupportAnimator;
import io.codetail.animation.ViewAnimationUtils;


/**
 * Created by CurTro Studios on 2/22/2016.
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private ProgressDialog dialog=null ;
    private String TAG="Main Activity";
    private String tag_json_arry = "json_array_req";
    private ProductsAdapter adapter;
    private ListView list;
    ArrayList<ProductRowData> rowdata;
    private SearchView searchView;
    private MenuItem myActionMenuItem;
    LinearLayout mRevealView;
    boolean hidden = true;
    private ImageButton gallery_btn, photo_btn, video_btn, audio_btn, location_btn, contact_btn;

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

        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mRevealView = (LinearLayout) findViewById(R.id.reveal_items);
        mRevealView.setVisibility(View.GONE);

        gallery_btn = (ImageButton) findViewById(R.id.login_img_btn);
        photo_btn = (ImageButton) findViewById(R.id.info_img_btn);
        video_btn = (ImageButton) findViewById(R.id.share_img_btn);
        audio_btn = (ImageButton) findViewById(R.id.sortAtoZ);
        location_btn = (ImageButton) findViewById(R.id.sortDate);
        contact_btn = (ImageButton) findViewById(R.id.sortRegion);

        gallery_btn.setOnClickListener(this);
        photo_btn.setOnClickListener(this);
        video_btn.setOnClickListener(this);
        audio_btn.setOnClickListener(this);
        location_btn.setOnClickListener(this);
        contact_btn.setOnClickListener(this);

        list=(ListView)findViewById(R.id.productList);
        list.setTextFilterEnabled(true);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //Get item at position
                ProductRowData item = (ProductRowData)parent.getItemAtPosition(position);

                //Pass the image title and url to DetailsActivity
                Intent intent = new Intent(MainActivity.this, ProductDetail.class);
                intent.putExtra("sid", item.getSID());
                intent.putExtra("name", item.getName());
                intent.putExtra("image", item.getImageURL());
                intent.putExtra("thumb", item.getThumbURL());
                intent.putExtra("description", item.getDescription());
                intent.putExtra("rating", item.getRating());

                //Start details activity
                startActivity(intent);
            }
        });
        rowdata=new ArrayList<ProductRowData>();

        dialog= new ProgressDialog(this);

        dialog.setMessage("Loading...");
        dialog.show();

        JsonArrayRequest request = new JsonArrayRequest(AppConfig.URL_MAIN,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString()); try {
                            for(int i=0;i<response.length();i++){
                                String sid=response.getJSONObject(i).getString("sid");
                                String name=response.getJSONObject(i).getString("product_name");
                                String img;
                                String thumb = response.getJSONObject(i).getString("product_thumb");
                                String description = response.getJSONObject(i).getString("product_description");
                                String rating = response.getJSONObject(i).getString("product_rating");

                                img = response.getJSONObject(i).getString("product_pic");

                                rowdata.add(new ProductRowData(sid,name,img,thumb,description,rating));
                            }
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        adapter=new ProductsAdapter(MainActivity.this, rowdata);
                        list.setAdapter(adapter);
                        dialog.dismiss();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "Error: " + error.getMessage());
                dialog.dismiss();
            }
        });

        VolleyController.getInstance().addToRequestQueue(request, tag_json_arry);




    }

    @Override
    public void onClick(View v) {
        hidden = true;
        switch (v.getId()) {

            case R.id.login_img_btn:

                break;
            case R.id.info_img_btn:

                break;
            case R.id.share_img_btn:

                break;
            case R.id.sortAtoZ:

                break;
            case R.id.sortDate:

                break;
            case R.id.sortRegion:

                break;
        }
    }

    public void Info(){
        Intent info = new Intent(MainActivity.this,
                InfoActivity.class);
        startActivity(info);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);

        myActionMenuItem = menu.findItem(R.id.action_search);
        searchView = (SearchView) myActionMenuItem.getActionView();
        searchView.clearFocus();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }


            @Override
            public boolean onQueryTextChange(String newText) {
                Filter filter = adapter.getFilter();

                if (TextUtils.isEmpty(newText)) {
                    filter.filter("");
                } else {
                    filter.filter(newText);
                }
                return true;
            }
        });
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.action_info:

                int cx = (mRevealView.getLeft() + mRevealView.getRight());
//                int cy = (mRevealView.getTop() + mRevealView.getBottom())/2;
                int cy = mRevealView.getTop();

                int radius = Math.max(mRevealView.getWidth(), mRevealView.getHeight());

                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {


                    SupportAnimator animator =
                            ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, 0, radius);
                    animator.setInterpolator(new AccelerateDecelerateInterpolator());
                    animator.setDuration(800);

                    SupportAnimator animator_reverse = animator.reverse();

                    if (hidden) {
                        mRevealView.setVisibility(View.VISIBLE);
                        animator.start();
                        hidden = false;
                    } else {
                        animator_reverse.addListener(new SupportAnimator.AnimatorListener() {
                            @Override
                            public void onAnimationStart() {

                            }

                            @Override
                            public void onAnimationEnd() {
                                mRevealView.setVisibility(View.INVISIBLE);
                                hidden = true;

                            }

                            @Override
                            public void onAnimationCancel() {

                            }

                            @Override
                            public void onAnimationRepeat() {

                            }
                        });
                        animator_reverse.start();

                    }
                } else {
                    if (hidden) {
                        Animator anim = android.view.ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, 0, radius);
                        mRevealView.setVisibility(View.VISIBLE);
                        anim.start();
                        hidden = false;

                    } else {
                        Animator anim = android.view.ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, radius, 0);
                        anim.addListener(new AnimatorListenerAdapter() {
                            @Override
                            public void onAnimationEnd(Animator animation) {
                                super.onAnimationEnd(animation);
                                mRevealView.setVisibility(View.INVISIBLE);
                                hidden = true;
                            }
                        });
                        anim.start();

                    }
                }

                return true;

            case android.R.id.home:
                supportFinishAfterTransition();
                return true;
            case R.id.action_search:
                return true;
            case R.id.action_share:
                return true;
        }
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        //int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        //if (id == R.id.action_search) {
        //    return true;
        //}
        //if (id == R.id.action_info) {
        //    return true;
        //}
        //if(id == R.id.action_share){
        //    //Share();
        //    return true;
        //}

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onResume() {
        super.onResume();

    }

    @Override
    protected void onPause() {
        super.onPause();

    }

}

And my main layout:

    <android.support.design.widget.CoordinatorLayout
    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:fitsSystemWindows="true"
    tools:context="com.curtrostudios.testapp.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="?attr/actionBarSize">

    <io.codetail.widget.RevealFrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/reveal_items"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <!--row 1 -->

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#F0EFED"
                android:orientation="horizontal"
                android:padding="16dp">

                <!--Gallery Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/login_img_btn"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_login" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Login" />
                </LinearLayout>

                <!--Photo Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/info_img_btn"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_info" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Info" />
                </LinearLayout>

                <!--Video Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/share_img_btn"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_share" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Share" />
                </LinearLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#F0EFED"
                android:orientation="horizontal"
                android:padding="16dp">

                <!--Gallery Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/sortAtoZ"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_a_z" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="A to Z" />
                </LinearLayout>

                <!--Photo Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/sortDate"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_sort_date" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Date" />
                </LinearLayout>

                <!--Video Icon -->
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageButton
                        android:id="@+id/sortRegion"
                        android:layout_width="70dp"
                        android:layout_height="70dp"
                        android:background="@mipmap/ic_region" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:text="Region" />
                </LinearLayout>

            </LinearLayout>

        </LinearLayout>

    </io.codetail.widget.RevealFrameLayout>
    </FrameLayout>

    <include layout="@layout/content_main" />

</android.support.design.widget.CoordinatorLayout>

This is my build.gradle(app) file:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "com.myapp.testapp"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.mcxiaoke.volley:library-aar:1.0.0'
    compile 'com.github.traex.rippleeffect:library:1.3'
    compile 'com.android.support:cardview-v7:23.1.1'
    compile 'com.wrapp.floatlabelededittext:library:0.0.6'
    compile('com.github.afollestad.material-dialogs:core:0.8.5.7@aar') {
        transitive = true
    }
    compile ('com.github.ozodrukh:CircularReveal:1.3.1@aar') {
        transitive = true;
    }
}

EDIT

This is within my build.gradle(project) file:

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}

Upvotes: 6

Views: 4829

Answers (5)

Steve C.
Steve C.

Reputation: 1353

For anyone else that may see this with the same issue of the reveal animation/menu not showing, this is how I solved the problem. It wasn't that the RevealFrameLayout wasn't showing, it was just showing behind everything else. So, as you can see in my layout below, I just moved the FrameLayout below all other content and it works flawlessly now.

Main Layout

    <android.support.design.widget.CoordinatorLayout
    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:fitsSystemWindows="true"
    tools:context="com.myapp.testapp.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    //Issue was solved by adding the FrameLayout here.
    //below all other content. Works perfectly now.
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <include layout="@layout/reveal_layout" />

    </FrameLayout>



</android.support.design.widget.CoordinatorLayout>

Upvotes: 2

Daniele Segato
Daniele Segato

Reputation: 12899

Let me guess, you are testing the code (and getting that error) on a pre-Lollipop device/emulator.

The class ViewAnimationUtils has been introduced in Android at SDK 21 (Lollipop).

Your minSdkVersion is 16. Have a look at this other question suggesting a support library to take back the circular reveal animation to Android 2.3. The library is CircularReveal. You'll have to fork io.codetail.animation.ViewAnimationUtils to use it.

EDIT: question didn't mention it was already using CircularReveal library -- actually can be seen by the log

referenced from method io.codetail.animation.ViewAnimationUtils.createCircularReveal

EDIT 2: after seeing the updated response and knowing from OP that the logcat is not an error but just a warning

This is not a problem at all. It's a Dalvik feature, it checks for missing classes / methods and warn you if it doesn't find them. It will not crash unless you actually try to call them.

OkHttp library has similar warning and you can see they also say you can ignore them.

As a side note, the CircularReveal library appear to use the @TargetApi annotation where it should use @SuppressLint("NewApi"). @TargetApi means you are supposed to call that method from that Api level only. Anyway this is not the cause for the warning since this information is only available at compile time.

Upvotes: 0

Amit Tiwari
Amit Tiwari

Reputation: 3692

Although, I was not able to figure out why you are getting the error because I haven't tried that library, but I think you can easily implement circular reveal without using the above library. Please have a look at Material-Animations, it has very neat working example for circular reveal which you can use easily.

Upvotes: 0

ishwor kafley
ishwor kafley

Reputation: 938

As library has clearly mentioned that you should first add remote maven url:

repositories {
        maven {
            url "https://jitpack.io"
        }
    }

and then a library dependency:

compile ('com.github.ozodrukh:CircularReveal:1.3.1@aar') {
        transitive = true;
    }

now try building the project and sync the gradle! If this doesn't helps, change aar version to 1.1.1

compile ('com.github.ozodrukh:CircularReveal:1.1.1@aar') {
        transitive = true;
    }

see if it helps.

also I suggest you to read this blog if the problem still persists!

Upvotes: 0

myoungjin
myoungjin

Reputation: 915

Check your imported library.

in my case,

import io.codetail.animation.SupportAnimator;
import io.codetail.animation.ViewAnimationUtils;

It occurs no error.

Upvotes: 0

Related Questions