使用滑动手势查看导航 android
Views Navigation Using Swipe Gesture android
基于 json ArrayList
我正在创建 TextView
的大小。
通过使用 class Display
,使每个 TextView
高度和宽度覆盖整个屏幕。
座右铭
Only 1 TextView
should be visible on the screen. By swiping it
should move to next view which will again occupy the entire screen.
Swipe down and Swipe up will move the screens i.e., views... swipe left and swipe right should do some other tasks,such as changing activity
使用 GestureDetector.SimpleOnGestureListener
启用滑动
到目前为止,我已经尝试使用 ViewFlipper
、TextView
数组来启用 TextView
之间的切换。但是失败了:(
代码片段:
for(int i=0;i<name.size();i++)
{
text = new TextView(MainActivity.this);
text.setText(name.get(i));
text.setId(i);
text.setTextColor(Color.parseColor("#000000"));
text.setLayoutParams(new LinearLayout.LayoutParams(realWidth, realHeight));
text.setGravity(Gravity.CENTER);
text.setTextSize(40);
text.setClickable(true);
vf.addView(text);
/*
//I've tried the following code while using TextView array
myTextViews[i] = text;
myTextViews[i].setId(i);
myTextViews[i].setTextColor(Color.BLACK);
myTextViews[i].setText(name.get(i));
myTextViews[i].setGravity(Gravity.CENTER);
myTextViews[i].setTextSize(40);
myTextViews[i].setLayoutParams(new LinearLayout.LayoutParams(realWidth, realHeight));
myTextViews[i].onWindowFocusChanged(false);
LL.addView(myTextViews[i]);
*/
View lines = new View(getApplicationContext());
lines.setBackgroundColor(Color.parseColor("#000000"));
lines.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1));
vf.addView(lines);
final int finalI = i;
text.setOnTouchListener(new MainActivity()
{
@Override
public void onSwipeLeft()
{
if (vf.getDisplayedChild() == 0)
Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
else
vf.showNext();
}
@Override
public void onSwipeRight()
{
if (vf.getDisplayedChild() == 0)
Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
else
vf.showPrevious();
}
});
}
错误:
同时使用 ViewFlipper
E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
数组:
E/InputEventReceiver﹕ Exception dispatching input event. -- java.lang.ArrayIndexOutOfBoundsException
编辑
我发现这个 Question 与 ios
相关。搜索相同的 android
I'm trying to develop a app similar to SimplEye
which will be used by Visually disabled people.
为此,我需要控制屏幕上的滑动,以便整个应用程序只能通过滑动的帮助来处理。
ViewPager、ViewFlipper、SimpleOnGestureListener 不符合要求。
请建议应该使用什么技术。
谢谢
使用 ViewPager 滑动视图(只能通过滑动手势;如果您需要在一段时间内滑动,那么 ViewFlipper 是更好的方法)。让你的 ViewPager
layout_width
/layout_height
属性都 match_parent
(在 xml 布局中定义 ViewPager
而不是通过代码)。也让你的 TextView
layout_width
/layout_height
match_parent
如此你根本不需要 Display
class.
编辑。 根据最新版本,TS 需要在整个应用程序中处理手势导航。我建议如下:
- 尽量不要使用任何自行处理手势(点击)的小部件(按钮、复选框等)。仅使用不可交互的视图并在
Activity
中实现 onTouchEvent
方法,在这种情况下它将接收所有触摸事件。在该方法中,您可以添加任何您想要的手势处理。
- 您可以创建自己的
ViewGroup
实现并覆盖 onInterceptTouchEvent
/onTouchEvent
方法并在那里手动执行任何手势处理。
在这两种情况下,您都需要自己创建所有手势检测逻辑。
这些 link 可能会有帮助
- Creating a simple Gesture Application in Android
- How to add our own gestures in android?
- 检测常见手势
没做过,但第一个 link 似乎最有用。它说您可以首先创建某种手势描述,然后手势 API 可以检查执行的任何手势是否与该描述相匹配。
基于这个问题我可以建议使用 ViewPager
这是您的 MOTTO 的替代方案,而不是您问题的解决方案
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
ViewPagerActivity
public class ViewPagerActivity extends Activity {
String text[] = {"A", "B",
"C", "D",
"E", "F",
"G", "H"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyPagerAdapter adapter = new MyPagerAdapter(this, text);
ViewPager myPager = (ViewPager) findViewById(R.id.viewpager);
myPager.setAdapter(adapter);
myPager.setCurrentItem(0);
//set Page Change Listner. to get callback on page changed or swiped
myPager .setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Log.e("Page Changed ", " YES ");
/// here you can check & perform on changed
Log.e("Current TextView Text ", text[position]);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
}
MyPagerAdapter
public class MyPagerAdapter extends PagerAdapter {
Activity activity;
int txtarray[];
public MyPagerAdapter(Activity act, int[] imgArra) {
txtarray = imgArra;
activity = act;
}
public int getCount() {
return txtarray.length;
}
public Object instantiateItem(View collection, int position) {
TextView view = new TextView(activity);
view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
view.setText(txtarray[position]);
((ViewPager) collection).addView(view, 0);
return view;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == ((View) arg1);
}
@Override
public Parcelable saveState() {
return null;
}
}
基于 json ArrayList
我正在创建 TextView
的大小。
通过使用 class Display
,使每个 TextView
高度和宽度覆盖整个屏幕。
座右铭
Only 1
TextView
should be visible on the screen. By swiping it should move to next view which will again occupy the entire screen.Swipe down and Swipe up will move the screens i.e., views... swipe left and swipe right should do some other tasks,such as changing activity
使用 GestureDetector.SimpleOnGestureListener
到目前为止,我已经尝试使用 ViewFlipper
、TextView
数组来启用 TextView
之间的切换。但是失败了:(
代码片段:
for(int i=0;i<name.size();i++)
{
text = new TextView(MainActivity.this);
text.setText(name.get(i));
text.setId(i);
text.setTextColor(Color.parseColor("#000000"));
text.setLayoutParams(new LinearLayout.LayoutParams(realWidth, realHeight));
text.setGravity(Gravity.CENTER);
text.setTextSize(40);
text.setClickable(true);
vf.addView(text);
/*
//I've tried the following code while using TextView array
myTextViews[i] = text;
myTextViews[i].setId(i);
myTextViews[i].setTextColor(Color.BLACK);
myTextViews[i].setText(name.get(i));
myTextViews[i].setGravity(Gravity.CENTER);
myTextViews[i].setTextSize(40);
myTextViews[i].setLayoutParams(new LinearLayout.LayoutParams(realWidth, realHeight));
myTextViews[i].onWindowFocusChanged(false);
LL.addView(myTextViews[i]);
*/
View lines = new View(getApplicationContext());
lines.setBackgroundColor(Color.parseColor("#000000"));
lines.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1));
vf.addView(lines);
final int finalI = i;
text.setOnTouchListener(new MainActivity()
{
@Override
public void onSwipeLeft()
{
if (vf.getDisplayedChild() == 0)
Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
else
vf.showNext();
}
@Override
public void onSwipeRight()
{
if (vf.getDisplayedChild() == 0)
Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
else
vf.showPrevious();
}
});
}
错误:
同时使用
ViewFlipper
E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
数组:
E/InputEventReceiver﹕ Exception dispatching input event. -- java.lang.ArrayIndexOutOfBoundsException
编辑
我发现这个 Question 与 ios
相关。搜索相同的 android
I'm trying to develop a app similar to SimplEye which will be used by Visually disabled people.
为此,我需要控制屏幕上的滑动,以便整个应用程序只能通过滑动的帮助来处理。
ViewPager、ViewFlipper、SimpleOnGestureListener 不符合要求。
请建议应该使用什么技术。 谢谢
使用 ViewPager 滑动视图(只能通过滑动手势;如果您需要在一段时间内滑动,那么 ViewFlipper 是更好的方法)。让你的 ViewPager
layout_width
/layout_height
属性都 match_parent
(在 xml 布局中定义 ViewPager
而不是通过代码)。也让你的 TextView
layout_width
/layout_height
match_parent
如此你根本不需要 Display
class.
编辑。 根据最新版本,TS 需要在整个应用程序中处理手势导航。我建议如下:
- 尽量不要使用任何自行处理手势(点击)的小部件(按钮、复选框等)。仅使用不可交互的视图并在
Activity
中实现onTouchEvent
方法,在这种情况下它将接收所有触摸事件。在该方法中,您可以添加任何您想要的手势处理。 - 您可以创建自己的
ViewGroup
实现并覆盖onInterceptTouchEvent
/onTouchEvent
方法并在那里手动执行任何手势处理。
在这两种情况下,您都需要自己创建所有手势检测逻辑。
这些 link 可能会有帮助
- Creating a simple Gesture Application in Android
- How to add our own gestures in android?
- 检测常见手势
没做过,但第一个 link 似乎最有用。它说您可以首先创建某种手势描述,然后手势 API 可以检查执行的任何手势是否与该描述相匹配。
基于这个问题我可以建议使用 ViewPager
这是您的 MOTTO 的替代方案,而不是您问题的解决方案
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
ViewPagerActivity
public class ViewPagerActivity extends Activity {
String text[] = {"A", "B",
"C", "D",
"E", "F",
"G", "H"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyPagerAdapter adapter = new MyPagerAdapter(this, text);
ViewPager myPager = (ViewPager) findViewById(R.id.viewpager);
myPager.setAdapter(adapter);
myPager.setCurrentItem(0);
//set Page Change Listner. to get callback on page changed or swiped
myPager .setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Log.e("Page Changed ", " YES ");
/// here you can check & perform on changed
Log.e("Current TextView Text ", text[position]);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
}
MyPagerAdapter
public class MyPagerAdapter extends PagerAdapter {
Activity activity;
int txtarray[];
public MyPagerAdapter(Activity act, int[] imgArra) {
txtarray = imgArra;
activity = act;
}
public int getCount() {
return txtarray.length;
}
public Object instantiateItem(View collection, int position) {
TextView view = new TextView(activity);
view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
view.setText(txtarray[position]);
((ViewPager) collection).addView(view, 0);
return view;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == ((View) arg1);
}
@Override
public Parcelable saveState() {
return null;
}
}