import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.ViewFlipper;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TableLayout.LayoutParams;
public class MainActivity extends Activity {
private ViewFlipper mVf;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mVf = new ViewFlipper(this);
mVf.setLongClickable(true);
mVf.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mVfDetector.onTouchEvent(event);
}
});
TextView tv = new TextView(this);
tv.setText("TextView 1");
tv.setBackgroundColor(0xffffffff);
mVf.addView(tv,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
TextView tv1 = new TextView(this);
tv1.setText("TextView 2");
tv1.setBackgroundColor(0xffffffff);
mVf.addView(tv1,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
ListView lv = new GestureListView(this);
lv.setBackgroundColor(0xff808080);
final String[] items = {"one", "two", "three", "four", "five", "six", "sevent", "eight", "nine"};
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items));
lv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mVfDetector.onTouchEvent(event);
}
});
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
new AlertDialog.Builder(MainActivity.this).setMessage(items[arg2]).create().show();
}
});
registerForContextMenu(lv);
mVf.addView(lv,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
ListView lv1 = new GestureListView(this);
lv.setBackgroundColor(0xff808040);
final String[] items1 = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
lv1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items1));
lv1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mVfDetector.onTouchEvent(event);
}
});
lv1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
new AlertDialog.Builder(MainActivity.this).setMessage(items[arg2]).create().show();
}
});
registerForContextMenu(lv1);
mVf.addView(lv1,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
setContentView(mVf);
}
private GestureDetector mVfDetector = new GestureDetector(new OnGestureListener() {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//left
Log.i("GestureDemo", "ViewFlipper left");
mVf.showNext();
return true;
}else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//right
Log.i("GestureDemo", "ViewFlipper right");
mVf.showPrevious();
return true;
}
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
});
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.add("Menu 1");
menu.add("Menu 2");
menu.add("Menu 3");
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
System.out.println("View " + info.position + " context menu activited.");
return super.onContextItemSelected(item);
}
class GestureListView extends ListView {
public GestureListView(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(mLvDetector.onTouchEvent(ev)) return true;
return super.onTouchEvent(ev);
}
private GestureDetector mLvDetector = new GestureDetector(new OnGestureListener() {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
public boolean onDown(MotionEvent e) {
int position = pointToPosition((int)e.getX(), (int)e.getY());
if( position != ListView.INVALID_POSITION) {
View child = getChildAt(position - getFirstVisiblePosition());
if(child != null) child.setPressed(true);
}
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//left
Log.i("GestureDemo", "ListView left");
mVf.showNext();
return true;
}else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//right
Log.i("GestureDemo", "ListView right");
mVf.showPrevious();
return true;
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
System.out.println("Listview long press");
int position = pointToPosition((int)e.getX(), (int)e.getY());
if( position != ListView.INVALID_POSITION) {
View child = getChildAt(position - getFirstVisiblePosition());
if(child != null) GestureListView.this.showContextMenuForChild(child);
}
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
});
}
}
分享到:
相关推荐
在Android应用开发中,"带有listview界面的滑动切换activity"是一种常见的交互设计,它提高了用户在多个页面间切换的便捷性。这种设计通常利用手势识别技术,特别是左右滑动手势,来实现Activity之间的平滑过渡。在...
标题中提到的"listview的item滑动效果"通常指的是Item的侧滑或者滑动显示/隐藏更多操作,比如常见的滑动删除、滑动切换状态等。为了实现这样的效果,我们可以使用滑动布局(SlidingLayout)或者SwipeRefreshLayout等...
`Android listView选项滑动效果`是指通过增强ListView的功能,使每个列表项可以左右滑动,通常用于实现更多的交互操作,比如滑动删除、切换状态等。这个描述提及的demo是基于`android-swipelistview-master`库,它为...
本文将详细讲解如何解决多个ListView与ScrollView滑动冲突的简单处理方法。 首先,理解冲突的本质:ScrollView是一个可以容纳多个View的容器,它可以垂直滚动。而ListView本身就是可滚动的列表,内部已经处理了滑动...
标题"viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页"描述的就是这样一个功能:在ViewPager中嵌套了一个ListView,ListView支持滑动删除,而当滑动到ListView之外的区域时,...
ListView是Android平台上...综上所述,实现ListView的滑动特效涉及多个方面,包括自定义动画、适配器、监听器以及第三方库的使用。通过巧妙地组合和定制这些元素,可以创造出各种酷炫的滑动效果,提升应用的用户体验。
在Android开发中,实现类似QQ滑动界面的效果通常涉及到`ViewPager`组件的使用,它可以创建一个可以左右滑动切换的页面容器。在这个场景下,我们不仅要实现`ViewPager`的滑动,还要在每个`ViewPager`的页面中嵌入`...
5. **标题切换**: 在右侧ListView滑动时,顶部应显示当前分类的标题。这可以通过在布局中添加TextView,并在滑动监听器中更新其文本来实现。 6. **联动逻辑**: 这是实现联动的关键。你需要维护一个全局变量来保存...
然而,当你尝试让ListView实现横向滑动时,可能会遇到一个需求:在滑动过程中,第一条数据(首例)始终保持固定,就像股票或基金应用中显示的那样。这种效果可以提供更好的用户体验,让用户在浏览时始终能看到关键...
`ViewPager`是一个可以左右滑动查看多个页面的组件,非常适合用来切换`TabHost`的标签页。 首先,引入`ViewPager`和`PagerAdapter`的依赖: ```xml dependencies { implementation 'androidx.viewpager:viewpager...
总的来说,“ListView滑动控件(一)(修正版)”涵盖了Android开发中增强ListView交互性的多个方面,包括但不限于侧滑删除、上滑加载更多、性能优化和自定义动画。开发者通过深入理解和应用这些技术,可以为用户...
ViewPager可以创建一个可滑动的页面集合,用户可以通过手势左右滑动切换页面,适合于展示多个相似内容的场景。HorizontalScrollView则提供了一个水平方向的滚动视图,它可以包含一个或多个水平排列的子视图。在这个...
3. 多个listview的滑动界面:Listview是一种在Android和iOS等平台上常用的视图组件,用于显示一串可滚动的项目列表。在应用中使用多个listview,可能表示不同的内容区域或数据集,用户可以通过滑动来浏览和交互。 4...
ViewPager可以展示多个页面,并且支持左右滑动切换,非常适合用来做轮播图。为了实现轮播,我们可以添加一个定时器,每隔一段时间自动切换到下一个页面,也可以监听滑动事件,当用户滑动时立即切换页面。 现在,将...
在Android开发中,有时我们需要在一个Activity中展示多个ListView,这些ListView可能会有联动效果,即一个ListView的操作会影响另一个ListView的显示。这种需求常见于数据分类、筛选或者多维度展示的场景。本篇将...
这个效果通常涉及到多个ListView或者RecyclerView的切换,通过滑动标签来展示不同的内容区域。下面我们将详细探讨这个效果实现的关键知识点。 首先,我们来看看“标签页”(Tab)的概念。在Android应用中,标签页是...
为了实现多个ListView的上下滑动,我们需要在Activity中添加多个ListView,并通过监听滑动事件来切换它们。例如,可以使用OnTouchListener监听滑动方向,并在滑动到底部时加载下一个ListView。同时,还需要注意...
这个项目可能包含了一个自定义的ListView子类,实现了滑动删除和长按切换位置的逻辑,同时可能还有对应的布局文件和适配器代码。开发者可以参考该项目的源码,学习如何处理触摸事件、动画效果以及数据与视图的同步。...
开发者通常需要自定义一个ListView的Adapter,并且重写onTouchEvent()方法,来监听用户的滑动操作。当检测到滑动事件时,可以启动一个滑动动画,使Item呈现出可删除的状态。 3. **GestureDetector**: ...
总的来说,"Android 卡片式滑动切换的ListView 源码"是一个涉及到Android UI组件深度定制的项目,它展示了如何将ListView、ViewPager和自定义布局结合,实现类似安卓5.0任务管理器的卡片效果。通过对源码的学习,...