ListView 项目扩展到 WebViews - 过渡动画
ListView items expanding to WebViews - Transition Animation
我有一个自定义 ListView,每个项目都打开本地 HTML 文件 (WebView)。
当我单击 ListView 项目到 WebView 时,我很难为过渡添加动画。我尝试在startActivity()
方法中使用ActivityOptions.makeSceneTransitionAnimation()
方法如下:-
MainActivity.java
public class MainActivity extends AppCompatActivity {
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list);
String[] values = new String[] { "LINK 1",
"LINK 2", "LINK 3"
};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, values) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (position==0||position==1||position==2) {
view.setBackgroundColor(Color.parseColor("#BBDEFB"));
} else {
view.setBackgroundColor(Color.parseColor("#006064"));
}
return view;
}
};
listView.setAdapter(adapter);
//final HashMap<String, Integer> hashMap = new HashMap<String, Integer> ();
**listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
if (position == 0) {
Intent myIntent = new Intent(getApplicationContext(),
WebViewActivity.class);
myIntent.putExtra("key", 0);
startActivity(myIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
}else if (position == 1) {
Intent myIntent = new Intent(getApplicationContext(),
WebViewActivity.class);
myIntent.putExtra("key", 1);
startActivity(myIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle() );
}else if (position == 2) {
Intent myIntent = new Intent(getApplicationContext(),
WebViewActivity.class);
myIntent.putExtra("key", 2);
startActivity(myIntent);
}**
}
});
但我收到以下错误:
Error:(69, 60) error: no suitable method found for makeSceneTransitionAnimation(<anonymous OnItemClickListener>)
method ActivityOptions.makeSceneTransitionAnimation(Activity,View,String) is not applicable
(actual and formal argument lists differ in length)
method ActivityOptions.makeSceneTransitionAnimation(Activity,Pair<View,String>...) is not applicable
(actual argument <anonymous OnItemClickListener> cannot be converted to Activity by method invocation conversion)
我的完整代码:
WebViewActivity.java
public class WebViewActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
webView = (WebView) findViewById(R.id.webView1);
//webView.setWebViewClient(new myWebClient());
webView.getSettings().setJavaScriptEnabled(true);
int pos = getIntent().getIntExtra("key", 0);
if (pos == 0) {
webView.loadUrl("file:///android_asset/index.html");
} else if (pos == 1) {
webView.loadUrl("file:///android_asset/index2.html");
} else if (pos == 2) {
webView.loadUrl("file:///android_asset/index3.html");
}
}
}
activity_main.xml
`
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.a405146.listview.MainActivity">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:background="?android:attr/selectableItemBackground"/>
</RelativeLayout>
`
activity_web_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.a405146.listview.WebViewActivity">
<WebView
android:id="@+id/webView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</RelativeLayout>
请帮助我了解哪里出了问题以及如何正确实施转换。
您需要为 listView 中的所有视图提供唯一的 transitionName。您可以在调用 getView 时在适配器中执行此操作,调用 setTransitionName 并设置唯一名称,例如字符串和当前位置的某种组合,这对于每个项目都是唯一的。在 getView 方法中写这样的东西
ViewCompat.setTransitionName(convertView, "list_item_"+position);
在下一个 activity 中,也为您的 WebView 指定一个唯一的 transitionName,例如 "sharedWebView"。现在,当您开始下一个 activity 时,为视图和视图将在下一个 activity 中出现的名称创建一个 Pair 对象。像这样
Pair<View, String> pair = Pair.create(view, "sharedWebView");
并在启动activity时传递它,也就是在这里传递对内部class的引用,但必须传递activity的引用。像这样
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, pair).toBundle());
我有一个自定义 ListView,每个项目都打开本地 HTML 文件 (WebView)。
当我单击 ListView 项目到 WebView 时,我很难为过渡添加动画。我尝试在startActivity()
方法中使用ActivityOptions.makeSceneTransitionAnimation()
方法如下:-
MainActivity.java
public class MainActivity extends AppCompatActivity {
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list);
String[] values = new String[] { "LINK 1",
"LINK 2", "LINK 3"
};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, values) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (position==0||position==1||position==2) {
view.setBackgroundColor(Color.parseColor("#BBDEFB"));
} else {
view.setBackgroundColor(Color.parseColor("#006064"));
}
return view;
}
};
listView.setAdapter(adapter);
//final HashMap<String, Integer> hashMap = new HashMap<String, Integer> ();
**listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
if (position == 0) {
Intent myIntent = new Intent(getApplicationContext(),
WebViewActivity.class);
myIntent.putExtra("key", 0);
startActivity(myIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
}else if (position == 1) {
Intent myIntent = new Intent(getApplicationContext(),
WebViewActivity.class);
myIntent.putExtra("key", 1);
startActivity(myIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle() );
}else if (position == 2) {
Intent myIntent = new Intent(getApplicationContext(),
WebViewActivity.class);
myIntent.putExtra("key", 2);
startActivity(myIntent);
}**
}
});
但我收到以下错误:
Error:(69, 60) error: no suitable method found for makeSceneTransitionAnimation(<anonymous OnItemClickListener>)
method ActivityOptions.makeSceneTransitionAnimation(Activity,View,String) is not applicable
(actual and formal argument lists differ in length)
method ActivityOptions.makeSceneTransitionAnimation(Activity,Pair<View,String>...) is not applicable
(actual argument <anonymous OnItemClickListener> cannot be converted to Activity by method invocation conversion)
我的完整代码:
WebViewActivity.java
public class WebViewActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
webView = (WebView) findViewById(R.id.webView1);
//webView.setWebViewClient(new myWebClient());
webView.getSettings().setJavaScriptEnabled(true);
int pos = getIntent().getIntExtra("key", 0);
if (pos == 0) {
webView.loadUrl("file:///android_asset/index.html");
} else if (pos == 1) {
webView.loadUrl("file:///android_asset/index2.html");
} else if (pos == 2) {
webView.loadUrl("file:///android_asset/index3.html");
}
}
}
activity_main.xml
`
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.a405146.listview.MainActivity">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:background="?android:attr/selectableItemBackground"/>
</RelativeLayout>
`
activity_web_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.a405146.listview.WebViewActivity">
<WebView
android:id="@+id/webView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</RelativeLayout>
请帮助我了解哪里出了问题以及如何正确实施转换。
您需要为 listView 中的所有视图提供唯一的 transitionName。您可以在调用 getView 时在适配器中执行此操作,调用 setTransitionName 并设置唯一名称,例如字符串和当前位置的某种组合,这对于每个项目都是唯一的。在 getView 方法中写这样的东西
ViewCompat.setTransitionName(convertView, "list_item_"+position);
在下一个 activity 中,也为您的 WebView 指定一个唯一的 transitionName,例如 "sharedWebView"。现在,当您开始下一个 activity 时,为视图和视图将在下一个 activity 中出现的名称创建一个 Pair 对象。像这样
Pair<View, String> pair = Pair.create(view, "sharedWebView");
并在启动activity时传递它,也就是在这里传递对内部class的引用,但必须传递activity的引用。像这样
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, pair).toBundle());