- 浏览: 116644 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
YaoSone:
你好,这个失效了,能帮忙再分享一下吗,谢谢了
IT十八掌 大数据技术资料+内部资料 -
yangcongyangling:
非常不错,学习中
IT十八掌 大数据技术资料+内部资料 -
ceekay_:
[flash=200,200][url][img][list] ...
android遍历sd卡中的所有文件 -
laohujibuzhu:
看看效果先
android ShapeDrawable实例 -
dengrui0917:
最近我也要做一个将图片压缩成气泡状的图片,下载研究一下
android ShapeDrawable实例
package com.fdgfdg;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class TestScrollActivity extends Activity {
/** Called when the activity is first created. */
MyScrollLayout layout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
layout = (MyScrollLayout)findViewById(R.id.myScroll);
Button button = (Button)findViewById(R.id.button);
View view = TestScrollActivity.this.getLayoutInflater().inflate(R.layout.child, null);
layout.addView(view);
View view1 = TestScrollActivity.this.getLayoutInflater().inflate(R.layout.list, null);
ListView listView = (ListView)view1.findViewById(R.id.listView);
// listView.setOnTouchListener(new OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// // TODO Auto-generated method stub
// return layout.onTouchEvent(event);
// }
// });
listView.setAdapter(new SimpleAdapter(this, getData(), R.layout.item, new String[]{"name"}, new int[]{R.id.textview}));
layout.addView(view1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// layout.removeAllViews();
// View view = TestScrollActivity.this.getLayoutInflater().inflate(R.layout.child, null);
// layout.addView(view);
// layout.invalidate();
}
});
}
private List<? extends Map<String, ?>> getData() {
ArrayList arrayList = new ArrayList();
for(int i=0;i<40;i++){
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put("name", "test"+i);
arrayList.add(hashMap);
}
return arrayList;
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class TestScrollActivity extends Activity {
/** Called when the activity is first created. */
MyScrollLayout layout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
layout = (MyScrollLayout)findViewById(R.id.myScroll);
Button button = (Button)findViewById(R.id.button);
View view = TestScrollActivity.this.getLayoutInflater().inflate(R.layout.child, null);
layout.addView(view);
View view1 = TestScrollActivity.this.getLayoutInflater().inflate(R.layout.list, null);
ListView listView = (ListView)view1.findViewById(R.id.listView);
// listView.setOnTouchListener(new OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// // TODO Auto-generated method stub
// return layout.onTouchEvent(event);
// }
// });
listView.setAdapter(new SimpleAdapter(this, getData(), R.layout.item, new String[]{"name"}, new int[]{R.id.textview}));
layout.addView(view1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// layout.removeAllViews();
// View view = TestScrollActivity.this.getLayoutInflater().inflate(R.layout.child, null);
// layout.addView(view);
// layout.invalidate();
}
});
}
private List<? extends Map<String, ?>> getData() {
ArrayList arrayList = new ArrayList();
for(int i=0;i<40;i++){
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put("name", "test"+i);
arrayList.add(hashMap);
}
return arrayList;
}
}
package com.fdgfdg; import android.R.bool; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.View.MeasureSpec; import android.widget.Scroller; public class MyScrollLayout extends ViewGroup{ private final static int TOUCH_ACTION_NONE = 0; private final static int TOUCH_ACTION_MOVE = 1; private final static int TOUCH_ACTION_SNAP = 2; private static final String TAG = "ScrollLayout"; private VelocityTracker mVelocityTracker; // 鐢ㄤ簬鍒ゆ柇鐢╁姩鎵嬪娍 private static final int SNAP_VELOCITY = 600; private Scroller mScroller; // 婊戝姩鎺у埗鍣? private int mCurScreen; private int mDefaultScreen = 0; private float mLastMotionX; private float mLastMotionY; private int mAction = TOUCH_ACTION_NONE; // private int mTouchSlop; // private static final int TOUCH_STATE_REST = 0; // private static final int TOUCH_STATE_SCROLLING = 1; // private int mTouchState = TOUCH_STATE_REST; private OnViewChangeListener mOnViewChangeListener; public MyScrollLayout(Context context) { super(context); // TODO Auto-generated constructor stub init(context); } public MyScrollLayout(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(context); } public MyScrollLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub init(context); } private void init(Context context) { mCurScreen = mDefaultScreen; // mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); mScroller = new Scroller(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub if (changed) { int childLeft = 0; final int childCount = getChildCount(); for (int i=0; i<childCount; i++) { final View childView = getChildAt(i); if (childView.getVisibility() != View.GONE) { final int childWidth = childView.getMeasuredWidth(); childView.layout(childLeft, 0, childLeft+childWidth, childView.getMeasuredHeight()); childLeft += childWidth; } } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec); final int widthMode = MeasureSpec.getMode(widthMeasureSpec); final int count = getChildCount(); for (int i = 0; i < count; i++) { getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec); } scrollTo(mCurScreen * width, 0); } public void snapToDestination() { final int screenWidth = getWidth(); final int destScreen = (getScrollX()+ screenWidth/2)/screenWidth; snapToScreen(destScreen); } public void snapToScreen(int whichScreen) { // get the valid layout page whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1)); if (getScrollX() != (whichScreen*getWidth())) { final int delta = whichScreen*getWidth()-getScrollX(); mScroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta)*2); mCurScreen = whichScreen; invalidate(); // Redraw the layout if (mOnViewChangeListener != null) { mOnViewChangeListener.OnViewChange(mCurScreen); } } } @Override public void computeScroll() { // TODO Auto-generated method stub if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } } @Override public boolean onTouchEvent(MotionEvent event) { final int action = event.getAction(); Log.i("", "onTouchEvent action="+action); final float x = event.getX(); final float y = event.getY(); // switch (action) { case MotionEvent.ACTION_DOWN: // Log.i("", "onTouchEvent ACTION_DOWN"); if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); mVelocityTracker.addMovement(event); } if (!mScroller.isFinished()){ mScroller.abortAnimation(); } mLastMotionX = x; mLastMotionY = y; break; case MotionEvent.ACTION_MOVE: int deltaX = (int)(mLastMotionX - x); int deltaY = (int)(mLastMotionY - y); if(mAction == TOUCH_ACTION_NONE){ if(Math.abs(deltaX) > 10 && Math.abs(deltaY) < 10){ mAction = TOUCH_ACTION_MOVE; }else if(Math.abs(deltaX) < 10 && Math.abs(deltaY) > 10){ mAction = TOUCH_ACTION_SNAP; } } if(mAction == TOUCH_ACTION_MOVE){ if (IsCanMove(deltaX)) { if (mVelocityTracker != null) { mVelocityTracker.addMovement(event); } mLastMotionX = x; scrollBy(deltaX, 0); } return false; } break; } return true; } // // public boolean onInterceptTouchEvent(MotionEvent ev) { // // TODO Auto-generated method stub // final int action = ev.getAction(); // if ((action == MotionEvent.ACTION_MOVE) // && (mTouchState != TOUCH_STATE_REST)) { // Log.i("", "onInterceptTouchEvent return true"); // return true; // } // final float x = ev.getX(); // final float y = ev.getY(); // switch (action) { // case MotionEvent.ACTION_MOVE: // final int xDiff = (int) Math.abs(mLastMotionX - x); // if (xDiff > mTouchSlop) { // mTouchState = TOUCH_STATE_SCROLLING; // } // break; // // case MotionEvent.ACTION_DOWN: // mLastMotionX = x; // // mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST // : TOUCH_STATE_SCROLLING; // break; // // case MotionEvent.ACTION_CANCEL: // case MotionEvent.ACTION_UP: // mTouchState = TOUCH_STATE_REST; // break; // } // // if (mTouchState != TOUCH_STATE_REST) // { // Log.i("", "mTouchState != TOUCH_STATE_REST return true"); // } // // // return mTouchState != TOUCH_STATE_REST; // } private boolean IsCanMove(int deltaX) { if (getScrollX() <= 0 && deltaX < 0 ) { return false; } if (getScrollX() >= (getChildCount() - 1) * getWidth() && deltaX > 0) { return false; } return true; } public void SetOnViewChangeListener(OnViewChangeListener listener) { mOnViewChangeListener = listener; } @Override public boolean dispatchTouchEvent(MotionEvent event) { // TODO Auto-generated method stub // TODO Auto-generated method stub final int action = event.getAction(); Log.i("", "dispatchTouchEvent action="+action); final float x = event.getX(); final float y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: Log.i("", "dispatchTouchEvent ACTION_DOWN"); if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); mVelocityTracker.addMovement(event); } if (!mScroller.isFinished()){ mScroller.abortAnimation(); } mLastMotionX = x; mLastMotionY = y; break; case MotionEvent.ACTION_MOVE: int deltaX = (int)(mLastMotionX - x); int deltaY = (int)(mLastMotionY - y); if(mAction == TOUCH_ACTION_NONE){ if(Math.abs(deltaX) > 10 && Math.abs(deltaY) < 10){ mAction = TOUCH_ACTION_MOVE; }else if(Math.abs(deltaX) < 10 && Math.abs(deltaY) > 10){ mAction = TOUCH_ACTION_SNAP; } } if(mAction == TOUCH_ACTION_MOVE){ if (IsCanMove(deltaX)) { if (mVelocityTracker != null) { mVelocityTracker.addMovement(event); } mLastMotionX = x; scrollBy(deltaX, 0); } return false; } break; case MotionEvent.ACTION_UP: int velocityX = 0; if (mVelocityTracker != null) { mVelocityTracker.addMovement(event); mVelocityTracker.computeCurrentVelocity(1000); velocityX = (int) mVelocityTracker.getXVelocity(); } if (velocityX > SNAP_VELOCITY && mCurScreen > 0) { // Fling enough to move left Log.e(TAG, "snap left"); snapToScreen(mCurScreen - 1); } else if (velocityX < -SNAP_VELOCITY && mCurScreen < getChildCount() - 1) { // Fling enough to move right Log.e(TAG, "snap right"); snapToScreen(mCurScreen + 1); } else { snapToDestination(); } if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } mAction = TOUCH_ACTION_NONE; // mTouchState = TOUCH_STATE_REST; break; } return super.dispatchTouchEvent(event); } }
package com.fdgfdg; public interface OnViewChangeListener { public void OnViewChange(int view); }
- TestScroll.rar (344.6 KB)
- 下载次数: 9
发表评论
文章已被作者锁定,不允许评论。
相关推荐
ListView通过Adapter来获取并展示数据,Adapter是连接数据源与ListView的桥梁。在Android Studio中,我们通常会创建一个自定义的Adapter,继承自BaseAdapter或者ArrayAdapter,重写其方法以提供数据和视图的绑定。 ...
在Android开发中,ScrollView与ListView的共存是一个常见的需求,特别是在设计复杂布局时。这两个组件都是用于滚动内容,但它们的使用方式和目的各有不同。ScrollView是一个可滚动的视图容器,可以包含一个或多个...
5. **事件传递与监听**:使用OnCheckedChangeListener监听Checkbox的状态改变,当Checkbox状态改变时,更新对应的Item状态,并可能影响到父级的全选状态。同时,对于父级全选Checkbox,需要监听其状态变化,以便同步...
将PopupMenu与ListView的各个子项关联起来,可以为用户提供更加直观且易用的操作方式。以下是对这一主题的详细阐述: 首先,PopupMenu是一个浮动菜单,当用户在特定控件(如ListView)上点击右键时,它会弹出。这种...
接下来,我们需要创建一个Adapter,Adapter是ListView与数据源之间的桥梁。它负责将数据转换为ListView可以理解的视图。Android提供了一个内置的ArrayAdapter,适用于简单的数据绑定。我们可以这样创建和设置Adapter...
在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。然而,当一个ListView内部需要嵌套另一个ListView时,就会出现一些挑战。标题"listView嵌套listViewDemo"指的是一个示例项目,旨在解决此类...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。然而,有时我们可能需要构建更复杂的界面,比如包含多级分类的数据结构,这时就需要用到ListView的嵌套。"ListView 嵌套 ListView demo"就是...
在Android开发中,ListView是一种常见的视图组件,用于展示大量数据列表。然而,在某些复杂的界面设计中,我们可能需要在一个ListView中嵌套另一个ListView,这就涉及到"ListView嵌套"的技术。这种技术可以用来构建...
在Android开发中,ScrollView和ListView是两种常用的布局控件,分别用于实现滚动视图和可滚动列表。然而,当它们需要被嵌套使用时,可能会遇到一些常见的问题,如显示异常(只显示第一行)和滑动冲突。本文将详细...
在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。然而,有时我们可能需要在一个ListView的项中再嵌套另一个ListView,这被称为ListView的嵌套。这样的设计可以用于展示复杂的数据结构,比如...
### ListView与ScrollView冲突问题及其解决方法 在Android应用开发中,`ListView`和`ScrollView`是两种常用的布局组件,它们分别用于展示可滚动的列表和单个可滚动的视图。然而,在某些场景下,开发者可能希望在一...
在Android开发中,ListView是一种常用的控件,用于展示大量数据列表。然而,有时我们的界面设计需要更复杂的布局,比如在一个ListView项中嵌套另一个GridView,或者一个ListView内再嵌套另一个ListView来实现时间轴...
在C#编程中,ListView控件是一个非常常用的组件,它用于显示数据集合,并且提供了多种视图模式,如图标、小图标、详细信息等。在这个"C# ListView使用例子ListView排列方式演示"中,我们将深入探讨如何利用ListView...
同时,需要确保在ListView的滑动手势与ViewPager的翻页手势之间进行冲突管理,防止误操作。 对于滑动非ListView区域时ViewPager翻页的实现,通常情况下,ViewPager会自动处理这种情况。只要用户的手势不在ListView...
在C#编程中,ListView控件是Windows Forms和WPF应用程序中常见的用于显示列表数据的组件。它提供了灵活的方式来展示信息...记住,关键在于正确地创建、添加和绑定事件到ComboBox,并确保它们与ListView的布局协调一致。
下面我们将详细探讨如何实现`ViewPager`与`ListView`的结合,让`ListView`能够实现横向滚动。 首先,`ViewPager`的核心在于它可以承载多个`Fragment`或者`View`,并提供平滑的左右滑动切换效果。`Adapter`是`...
- ListView的工作原理基于Adapter,Adapter是一个桥梁,负责将数据源与ListView的视图绑定。 2. **自定义Adapter**: - 为了在ListView中展示Switch,我们需要创建一个自定义的Adapter。这个Adapter需要继承自...
在VB(Visual Basic)编程环境中,ListView控件是一种常用且功能强大的组件,它允许开发者以列表形式展示数据。在默认情况下,ListView控件通常只支持读取操作,但通过一些扩展和自定义,我们可以实现其列数据的编辑...
在Android开发中,ScrollView和ListView是两种常用的布局组件,它们分别用于实现可滚动的大视图和展示多行可滚动的数据列表。然而,在实际应用中,当这两种组件同时存在于一个界面时,滚动冲突的问题就会出现,导致...