Gallery的简单实用和Gallery的没落以及网上大牛给出的HorizontialListView水平方向ListView
来源:互联网 发布:win10没有解压软件 编辑:程序博客网 时间:2024/05/22 15:57
今天本来是学习Gallery控件的,但是在用的时候发现Gallery有一道横线,说是已经过期,所以就在网上查了下,网友都推荐使用水平方向的ListView(是网上大牛实现的)
接下来会给出Gallery和HorizontialListView使用效果上的区别:
1.首先给出Gallery的实现图片浏览的源码以及效果
MainActivity.java
public class MainActivity extends Activity implements OnItemSelectedListener,ViewFactory{// 准备数据源private int[] res = { R.drawable.item1, R.drawable.item2, R.drawable.item3,R.drawable.item4, R.drawable.item5, R.drawable.item6,R.drawable.item7, R.drawable.item8, R.drawable.item9,R.drawable.item10, R.drawable.item11, R.drawable.item12 };private ImageAdapter adapter;private Gallery gallery;private ImageSwitcher is;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);gallery = (Gallery) findViewById(R.id.gallery);is=(ImageSwitcher) findViewById(R.id.is);// gallery加载适配器adapter = new ImageAdapter(res, this);gallery.setAdapter(adapter); gallery.setOnItemSelectedListener(this); is.setFactory(this); is.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));is.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); }@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position,long id) {// TODO Auto-generated method stub//image.setBackgroundResource(res[position%res.length]);is.setBackgroundResource(res[position%res.length]);}@Overridepublic void onNothingSelected(AdapterView<?> parent) {// TODO Auto-generated method stub}@Overridepublic View makeView() {// TODO Auto-generated method stubImageView image=new ImageView(this);image.setScaleType(ScaleType.FIT_CENTER);return image;}}
public class ImageAdapter extends BaseAdapter {private int[] res;private Context context;public ImageAdapter(int[] res, Context context) {this.res = res;this.context = context;}@Overridepublic int getCount() {return Integer.MAX_VALUE;}@Overridepublic Object getItem(int position) {return res[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View arg1, ViewGroup arg2) {// TODO Auto-generated method stubImageView image = new ImageView(context);image.setBackgroundResource(res[position%res.length]);image.setScaleType(ScaleType.FIT_XY);return image;}}
布局文件:
<LinearLayout 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:orientation="vertical" tools:context="${relativePackage}.${activityClass}" > <Gallery android:id="@+id/gallery" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageSwitcher android:id="@+id/is" android:layout_width="match_parent" android:layout_height="wrap_content" > </ImageSwitcher></LinearLayout>
实现效果:
从效果看,Gallery刚开始时左边留有空白,明显是不好看的,所以就有了下面的案例
2.HorizontialListView的实现图片浏览的源码以及效果:
MainActivity.java的源码只是将上面代码中的Gallery换成HorizontialListView对象
Adapter用的也是上面的ImageAdapter
布局文件也很相似如下:
<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" tools:context="${relativePackage}.${activityClass}" > <com.example.horizlistview.HorizontialListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="300dp" android:layout_alignParentTop="true" /> <ImageSwitcher android:layout_centerHorizontal="true" android:id="@+id/is" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/listview" > </ImageSwitcher></RelativeLayout>注意上面的HorizontialListView控件一定要指定高度,不要自适应(wrap_content),否则他会占满整个屏幕,我做的时候就应为这个吃了大亏,以为代码逻辑有错
实现效果:
这个就没有Gallery那个留有空白的问题了
最后给出网上大牛写的继承自AdapterView<ListAdapter>的HorizontialListView源码
import java.util.LinkedList;import java.util.Queue;import android.content.Context;import android.database.DataSetObserver;import android.graphics.Rect;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.GestureDetector.OnGestureListener;import android.view.MotionEvent;import android.view.View;import android.widget.AdapterView;import android.widget.ListAdapter;import android.widget.Scroller;public class HorizontialListView extends AdapterView<ListAdapter> {public boolean mAlwaysOverrideTouch = true;protected ListAdapter mAdapter;private int mLeftViewIndex = -1;private int mRightViewIndex = 0;protected int mCurrentX;protected int mNextX;private int mMaxX = Integer.MAX_VALUE;private int mDisplayOffset = 0;protected Scroller mScroller;private GestureDetector mGesture;private Queue<View> mRemovedViewQueue = new LinkedList<View>();private OnItemSelectedListener mOnItemSelected;private OnItemClickListener mOnItemClicked;private OnItemLongClickListener mOnItemLongClicked;private boolean mDataChanged = false;public HorizontialListView(Context context, AttributeSet attrs) {super(context, attrs);initView();}private synchronized void initView() {mLeftViewIndex = -1;mRightViewIndex = 0;mDisplayOffset = 0;mCurrentX = 0;mNextX = 0;mMaxX = Integer.MAX_VALUE;mScroller = new Scroller(getContext());mGesture = new GestureDetector(getContext(), mOnGesture);}@Overridepublic void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) {mOnItemSelected = listener;}@Overridepublic void setOnItemClickListener(AdapterView.OnItemClickListener listener){mOnItemClicked = listener;}@Overridepublic void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) {mOnItemLongClicked = listener;}private DataSetObserver mDataObserver = new DataSetObserver() {@Overridepublic void onChanged() {synchronized(HorizontialListView.this){mDataChanged = true;}invalidate();requestLayout();}@Overridepublic void onInvalidated() {reset();invalidate();requestLayout();}};@Overridepublic ListAdapter getAdapter() {return mAdapter;}@Overridepublic View getSelectedView() {//TODO: implementreturn null;}@Overridepublic void setAdapter(ListAdapter adapter) {if(mAdapter != null) {mAdapter.unregisterDataSetObserver(mDataObserver);}mAdapter = adapter;mAdapter.registerDataSetObserver(mDataObserver);reset();}private synchronized void reset(){initView();removeAllViewsInLayout(); requestLayout();}@Overridepublic void setSelection(int position) {//TODO: implement}private void addAndMeasureChild(final View child, int viewPos) {LayoutParams params = child.getLayoutParams();if(params == null) {params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);}addViewInLayout(child, viewPos, params, true);child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));}@Overrideprotected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);if(mAdapter == null){return;}if(mDataChanged){int oldCurrentX = mCurrentX;initView();removeAllViewsInLayout();mNextX = oldCurrentX;mDataChanged = false;}if(mScroller.computeScrollOffset()){int scrollx = mScroller.getCurrX();mNextX = scrollx;}if(mNextX <= 0){mNextX = 0;mScroller.forceFinished(true);}if(mNextX >= mMaxX) {mNextX = mMaxX;mScroller.forceFinished(true);}int dx = mCurrentX - mNextX;removeNonVisibleItems(dx);fillList(dx);positionItems(dx);mCurrentX = mNextX;if(!mScroller.isFinished()){post(new Runnable(){@Overridepublic void run() {requestLayout();}});}}private void fillList(final int dx) {int edge = 0;View child = getChildAt(getChildCount()-1);if(child != null) {edge = child.getRight();}fillListRight(edge, dx);edge = 0;child = getChildAt(0);if(child != null) {edge = child.getLeft();}fillListLeft(edge, dx);}private void fillListRight(int rightEdge, final int dx) {while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) {View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this);addAndMeasureChild(child, -1);rightEdge += child.getMeasuredWidth();if(mRightViewIndex == mAdapter.getCount()-1) {mMaxX = mCurrentX + rightEdge - getWidth();}if (mMaxX < 0) {mMaxX = 0;}mRightViewIndex++;}}private void fillListLeft(int leftEdge, final int dx) {while(leftEdge + dx > 0 && mLeftViewIndex >= 0) {View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this);addAndMeasureChild(child, 0);leftEdge -= child.getMeasuredWidth();mLeftViewIndex--;mDisplayOffset -= child.getMeasuredWidth();}}private void removeNonVisibleItems(final int dx) {View child = getChildAt(0);while(child != null && child.getRight() + dx <= 0) {mDisplayOffset += child.getMeasuredWidth();mRemovedViewQueue.offer(child);removeViewInLayout(child);mLeftViewIndex++;child = getChildAt(0);}child = getChildAt(getChildCount()-1);while(child != null && child.getLeft() + dx >= getWidth()) {mRemovedViewQueue.offer(child);removeViewInLayout(child);mRightViewIndex--;child = getChildAt(getChildCount()-1);}}private void positionItems(final int dx) {if(getChildCount() > 0){mDisplayOffset += dx;int left = mDisplayOffset;for(int i=0;i<getChildCount();i++){View child = getChildAt(i);int childWidth = child.getMeasuredWidth();child.layout(left, 0, left + childWidth, child.getMeasuredHeight());left += childWidth + child.getPaddingRight();}}}public synchronized void scrollTo(int x) {mScroller.startScroll(mNextX, 0, x - mNextX, 0);requestLayout();}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {boolean handled = super.dispatchTouchEvent(ev);handled |= mGesture.onTouchEvent(ev);return handled;}protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {synchronized(HorizontialListView.this){mScroller.fling(mNextX, 0, (int)-velocityX, 0, 0, mMaxX, 0, 0);}requestLayout();return true;}protected boolean onDown(MotionEvent e) {mScroller.forceFinished(true);return true;}private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() {@Overridepublic boolean onDown(MotionEvent e) {return HorizontialListView.this.onDown(e);}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {return HorizontialListView.this.onFling(e1, e2, velocityX, velocityY);}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {synchronized(HorizontialListView.this){mNextX += (int)distanceX;}requestLayout();return true;}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {for(int i=0;i<getChildCount();i++){View child = getChildAt(i);if (isEventWithinView(e, child)) {if(mOnItemClicked != null){mOnItemClicked.onItemClick(HorizontialListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId( mLeftViewIndex + 1 + i ));}if(mOnItemSelected != null){mOnItemSelected.onItemSelected(HorizontialListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId( mLeftViewIndex + 1 + i ));}break;}}return true;}@Overridepublic void onLongPress(MotionEvent e) {int childCount = getChildCount();for (int i = 0; i < childCount; i++) {View child = getChildAt(i);if (isEventWithinView(e, child)) {if (mOnItemLongClicked != null) {mOnItemLongClicked.onItemLongClick(HorizontialListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i));}break;}}}private boolean isEventWithinView(MotionEvent e, View child) { Rect viewRect = new Rect(); int[] childPosition = new int[2]; child.getLocationOnScreen(childPosition); int left = childPosition[0]; int right = left + child.getWidth(); int top = childPosition[1]; int bottom = top + child.getHeight(); viewRect.set(left, top, right, bottom); return viewRect.contains((int) e.getRawX(), (int) e.getRawY()); }};}这个代码粘到你的项目中直接可以用,很方便
0 0
- Gallery的简单实用和Gallery的没落以及网上大牛给出的HorizontialListView水平方向ListView
- Gallery的简单应用
- 解决!Gallery中嵌套ListView,Gallery不能滑动的问题
- 与listView功能相近的gallery,主讲gallery
- Gallery的简单分析摘要
- 简单的Gallery控件使用
- ImageSwither、Gallery的简单用法
- HorizontalScrollView 替换 过期Gallery 的实用demo
- ImageSwitcher 和 Gallery 的使用
- ImageSwitcher和Gallery的运用
- ImageView和Gallery的使用
- ImageSwitcher和Gallery的使用
- Android-ListView实现类似Gallery的功能
- Android-ListView实现类似Gallery的功能
- android Gallery模拟左右滑动的listView
- Gallery的使用 以及 AlertDialog的使用
- 水平方向滚动的listview
- Gallery的简单功能和用法(画廊视图)
- How to show related products in product view page with magento?
- JScrollPane+JTree的使用+container 是JPanel
- 图像放缩中最近邻插值和双线性插值的基本原理
- [CF81D] Polycarp's Picture Gallery && 贪心构造
- C语言大数相加
- Gallery的简单实用和Gallery的没落以及网上大牛给出的HorizontialListView水平方向ListView
- 关键字final,static break,return的应用
- Leetcode - Partition List.
- grid学习总结
- [CF486E] LIS of Sequence && DP
- UVA 11455 || Behold my quadrangle(三条边相加小等于最长边,不能组成四边形
- DSP TMS320F2812验证平台制作日志3
- C 语言中的指针和内存泄漏
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)