Android中的循环显示和CircularRevealLibrary问题

我正在遵循本教程中的“T”,但是当我运行应用程序时,我在logcat中收到以下消息。 我不确定出了什么问题,因为class级应该在那里吗?

找不到方法android.view.ViewAnimationUtils.createCircularReveal,从方法io.codetail.animation.ViewAnimationUtils.createCircularReveal引用

主要活动:

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 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(); dialog= new ProgressDialog(this); dialog.setMessage("Loading..."); dialog.show(); JsonArrayRequest request = new JsonArrayRequest(AppConfig.URL_MAIN, new Response.Listener() { @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(); } } 

而我的主要布局:

                                                 

这是我的build.gradle(app)文件:

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

编辑

这是在我的build.gradle(项目)文件中:

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

对于其他任何人可能会看到这个与揭示animation/菜单没有显示相同的问题,这就是我解决问题的方法。 并不是RevealFrameLayout没有显示,它只是显示在其他一切背后。 因此,正如您在下面的布局中所看到的,我只是将FrameLayout移动到所有其他内容之下,现在它完美无缺。

主要布局

       //Issue was solved by adding the FrameLayout here. //below all other content. Works perfectly now.     

检查导入的库。

就我而言,

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

它没有发生错误。

正如图书馆已明确提到您应首先添加远程mavenurl:

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

然后是库依赖:

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

现在尝试构建项目并同步gradle! 如果这没有帮助,请将aar版本更改为1.1.1

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

看看它是否有帮助。

如果问题仍然存在,我建议你阅读这篇博客!

虽然,我无法弄清楚你为什么会收到错误,因为我没有尝试过这个库,但我认为你可以轻松地实现循环显示而不使用上面的库。 请看一下Material-Animations ,它有一个非常简洁的圆形显示工作示例,您可以轻松使用。

让我猜一下,您正在测试前Lollipop设备/仿真器上的代码(并获得该错误)。

ViewAnimationUtils类已在Android 21 SDK(Lollipop)中引入。

你的minSdkVersion16 。 看看另一个问题,建议一个支持库将圆形揭示animation带回Android 2.3。 该库是CircularReveal 。 你必须使用fork io.codetail.animation.ViewAnimationUtils来使用它。

编辑:问题没有提到它已经使用CircularReveal库 – 实际上可以通过日志看到

从方法io.codetail.animation.ViewAnimationUtils.createCircularReveal引用

编辑2:在看到更新的响应并且从OP知道logcat不是错误而只是警告之后

这根本不是问题。 这是一个Dalvikfunction,它会检查缺少的类/方法,并在没有find它们时发出警告。 除非你真的试图调用它们,否则它不会崩溃。

OkHttp库有类似的警告,你可以看到他们也说你可以忽略它们。

作为旁注, CircularReveal库似乎使用 @TargetApi注释,它应该使用@SuppressLint("NewApi")@TargetApi意味着你应该只从该Api级别调用该方法。 无论如何,这不是警告的原因,因为此信息仅在编译时可用。