android水平循环滚动控件使用详解

本文实例为大家分享了android水平循环滚动控件的具体代码,供大家参考,具体内容如下

CycleScrollView.java

package com.example.test; 

import android.content.Context;
import android.graphics.Rect;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller; 

@SuppressWarnings("deprecation")
public class CycleScrollView<T> extends ViewGroup implements OnGestureListener { 

 static final String TAG = "CycleScrollView";
 Context mContext; 

 /**
  * Scroll velocity.
  */
 public static final long SCROLL_VELOCITY = 50; 

 /**
  * Scroll offset.
  */
 public static final int SCROLL_OFFSET = -1; 

 /**
  * Touch delay.
  */
 public static final long TOUCH_DELAYMILLIS = 2000; 

 /**
  * Fling duration.
  */
 public static final int FLING_DURATION = 2000; 

 /**
  * Filing max velocity x.
  */
 public static final int MAX_VELOCITY_X = 1000; 

 private GestureDetector detector;
 private Handler mHandler;
 private Scroller mScroller; 

 /**
  * Callback interface adapter and OnItemClick.
  */
 private CycleScrollAdapter<T> mAdapter;
 private OnItemClickListener mOnItemClickListener; 

 /**
  * Scroll index
  */
 private int mPreIndex;
 private int mCurrentIndex;
 private int mNextIndex;
 private View mCurrentView;
 private View mPreView;
 private View mNextView; 

 private float mLastMotionX; 

 // The reLayout is false can not invoke onLayout.
 private boolean reLayout = false; 

 // If the item count more than screen that can scroll.
 private boolean canScroll = false; 

 // A flag for switch current view.
 private boolean mCurrentViewAtLeft = true; 

 // Fling distance.
 private int mFlingX = 0; 

 private boolean isMoveAction = false; 

 private int defaultItemY = 10; 

 private int maxItemCount = 7; 

 private int initItemX = 20; 

 /**
  * The screen width.
  */
 private int screenWidth; 

 /**
  * Item view height.
  */
 private int itemHeight; 

 /**
  * Item view width.
  */
 private int itemWidth; 

 /**
  * Item view layout x.
  */
 private int itemX = getInitItemX(); 

 /**
  * Item view layout y.
  */
 private int itemY = defaultItemY; 

 // Auto scroll view task.
 private final Runnable mScrollTask = new Runnable() { 

  @Override
  public void run() {
   if (canScroll) {
    scrollView(SCROLL_OFFSET);
    mHandler.postDelayed(this, SCROLL_VELOCITY);// Loop self.
   }
  }
 }; 

 public CycleScrollView(Context context) {
  super(context);
  onCreate(context);
 } 

 public CycleScrollView(Context context, AttributeSet attrs) {
  super(context, attrs);
  onCreate(context);
 } 

 public CycleScrollView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  onCreate(context);
 } 

 private void onCreate(Context context) {
  mContext = context;
  detector = new GestureDetector(this);
  mHandler = new Handler();
  mScroller = new Scroller(context);
 } 

 /**
  * Create scroll index.
  */
 public void createIndex() {
  if (canScroll) {
   mPreIndex = maxItemCount - 1;
   mCurrentIndex = 0;
   mNextIndex = 1;
   mPreView = getChildAt(mPreIndex);
   mCurrentView = getChildAt(mCurrentIndex);
   mNextView = getChildAt(mNextIndex);
  }
 } 

 /**
  * Set item click callback.
  *
  * @param onItemClickListener
  *   The callback
  */
 public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
  mOnItemClickListener = onItemClickListener;
 } 

 /**
  * Set itemAdapter for addItem and bindItem.
  *
  * @param itemAdapter
  */
 public void setAdapter(CycleScrollAdapter<T> adapter) {
  mAdapter = adapter;
 } 

 /**
  * Start auto scroll.
  */
 public void startScroll() {
  if (canScroll) {
   mHandler.post(mScrollTask);
  }
 } 

 /**
  * Stop auto scroll and filing scroll task.
  */
 public void stopScroll() {
  mHandler.removeCallbacks(mScrollTask);
 } 

 /**
  * Delay start auto scroll task.
  */
 public void delayStartScroll() {
  if (canScroll) {
   mHandler.postDelayed(mScrollTask, TOUCH_DELAYMILLIS);
  }
 } 

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  int count = this.getChildCount();
  for (int i = 0; i < count; i++) {
   View child = this.getChildAt(i);
   child.measure(widthMeasureSpec, heightMeasureSpec);
  }
 } 

 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  /**
   * On layout set the child view layout by x y width and height.
   */
  if (reLayout) {// Run one times.
   for (int i = 0; i < getChildCount(); i++) {
    View child = this.getChildAt(i);
    child.setVisibility(View.VISIBLE);
    child.layout(itemX, getItemY(), itemX + getItemWidth(),
      getItemY() + getItemHeight());
    itemX += getItemMargin();
   }
   reLayout = !reLayout;
  }
 } 

 /**
  * When fling view run the fling task scroll view.
  */
 @Override
 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
   float velocityY) { 

  if (e1 == null || e2 == null) {
   return false;
  } 

  // When deltaX and velocityX not good return false.
  if (Math.abs(velocityX) < MAX_VELOCITY_X) {
   return false;
  } 

  // Get the delta x.
  float deltaX = (e1.getX() - e2.getX()); 

  /**
   * If can fling stop other scroll task at first , delay the task after
   * fling.
   */
  mHandler.removeCallbacks(mScrollTask);
  if (canScroll) {
   mHandler.postDelayed(mScrollTask, TOUCH_DELAYMILLIS
     + FLING_DURATION - 1000);
  } 

  /**
   * The flingX is fling distance.
   */
  mFlingX = (int) deltaX; 

  // Start scroll with fling x.
  mScroller.startScroll(0, 0, mFlingX, 0, FLING_DURATION);
  return false;
 } 

 @Override
 public void computeScroll() {
  if (canScroll && mScroller.computeScrollOffset()) {
   /**
    * The Scroller.getCurrX() approach mFlingX , the deltaX more and
    * more small.
    */
   int deltaX = mFlingX - mScroller.getCurrX();
   scrollView(-deltaX / 10);
   postInvalidate();
  }
 } 

 /**
  * When touch event is move scroll child view.
  */
 @Override
 public boolean onTouchEvent(MotionEvent ev) { 

  // Get event x,y at parent view.
  final float x = ev.getX(); 

  /**
   * Get event x,y at screen.
   */
  final int rawX = (int) ev.getRawX();
  final int rawY = (int) ev.getRawY(); 

  switch (ev.getAction()) {
  case MotionEvent.ACTION_DOWN:
   // Reset isMoveAction.
   isMoveAction = false;
   // Get motionX.
   mLastMotionX = x;
   break;
  case MotionEvent.ACTION_MOVE:
   // When action move set isMoveAction true.
   isMoveAction = true;
   // Only support one pointer.
   if (ev.getPointerCount() == 1) {
    // Compute delta X.
    int deltaX = 0;
    deltaX = (int) (x - mLastMotionX);
    mLastMotionX = x;
    // When canScroll is true, scrollView width deltaX.
    if (canScroll) {
     scrollView(deltaX);
    }
   }
   break;
  case MotionEvent.ACTION_UP:
   /**
    * If not move find click item and invoke click event.
    */
   if (!isMoveAction) {
    View view = getClickItem(rawX, rawY);
    if (view != null) {
     mOnItemClickListener.onItemClick(Integer.valueOf(view
       .getTag().toString()));
    }
   }
   break;
  }
  return this.detector.onTouchEvent(ev);
 } 

 /**
  * Get click item view by rawX and rawY.
  * @param rawX the x at screen.
  * @param rawY the y at screen.
  * @return the click item view.
  */
 private View getClickItem(final int rawX, final int rawY) {
  for (int i = 0; i < getChildCount(); i++) {
   View child = getChildAt(i);
   // Get item view rect.
   Rect rect = new Rect();
   child.getGlobalVisibleRect(rect);
   // If click point on the item view, invoke the click event.
   if (rect.contains(rawX, rawY)) {
    return child;
   }
  }
  return null;
 } 

 /**
  * Scroll view by delta x.
  *
  * @param deltaX
  *   The scroll distance.
  */
 private void scrollView(int deltaX) {
  // Move child view by deltaX.
  moveChildView(deltaX);
  // After move change index.
  if (deltaX < 0) {// move left
   // If current at right switch current view to left.
   switchCurrentViewToLeft();
   // change previous current next index.
   moveToNext();
  } else {// move right
   // If current at left switch current view to right.
   switchCurrentViewToRight();
   // change previous current next index.
   moveToPre();
  }
  invalidate();
 } 

 /**
  * Move view by delta x.
  *
  * @param deltaX
  *   The move distance.
  */
 private void moveChildView(int deltaX) {
  for (int i = 0; i < getChildCount(); i++) {
   View child = getChildAt(i);
   child.layout(child.getLeft() + deltaX, child.getTop(),
     child.getRight() + deltaX, child.getBottom());
  }
 } 

 /**
  * Current event is move to left, if current view at right switch current
  * view to left.
  */
 private void switchCurrentViewToLeft() {
  if (!mCurrentViewAtLeft) {
   mPreIndex = mCurrentIndex;
   mCurrentIndex = mNextIndex;
   mNextIndex++;
   if (mNextIndex > maxItemCount - 1) {
    mNextIndex = 0;
   }
   mCurrentView = getChildAt(mCurrentIndex);
   mPreView = getChildAt(mPreIndex);
   mNextView = getChildAt(mNextIndex);
   mCurrentViewAtLeft = !mCurrentViewAtLeft;
  }
 } 

 /**
  * Current event is move to right, if current view at left switch current
  * view to right.
  */
 private void switchCurrentViewToRight() {
  if (mCurrentViewAtLeft) {
   mNextIndex = mCurrentIndex;
   mCurrentIndex = mPreIndex;
   mPreIndex--;
   if (mPreIndex < 0) {
    mPreIndex = maxItemCount - 1;
   }
   mCurrentView = getChildAt(mCurrentIndex);
   mPreView = getChildAt(mPreIndex);
   mNextView = getChildAt(mNextIndex);
   mCurrentViewAtLeft = !mCurrentViewAtLeft;
  }
 } 

 /**
  * Current event is move to left,if current view move out of screen move the
  * current view to right and reBind the item change index.
  */
 private void moveToNext() {
  if (mCurrentView.getRight() < 0) {
   mCurrentView.layout(mPreView.getLeft() + getItemMargin(),
     getItemY(), mPreView.getLeft() + getItemMargin()
       + getItemWidth(), getItemY() + getItemHeight()); 

   if (mCurrentView.getTag() != null) {
    int listIndex = (Integer) mCurrentView.getTag();
    int index = (listIndex + maxItemCount) % mAdapter.getCount();
    mAdapter.bindView(mCurrentView, mAdapter.get(index));
    mCurrentView.setTag(index);
   } 

   mPreIndex = mCurrentIndex;
   mCurrentIndex = mNextIndex;
   mNextIndex++;
   if (mNextIndex > maxItemCount - 1) {
    mNextIndex = 0;
   }
   mCurrentView = getChildAt(mCurrentIndex);
   mPreView = getChildAt(mPreIndex);
   mNextView = getChildAt(mNextIndex);
   moveToNext();
  }
 } 

 /**
  * Current event is move to right,if current view move out of screen move
  * the current view to left and reBind the item change index.
  */
 private void moveToPre() {
  if (mCurrentView.getLeft() > getScreenWidth()) {
   mCurrentView.layout(mNextView.getLeft() - getItemMargin(),
     getItemY(), mNextView.getLeft() - getItemMargin()
       + getItemWidth(), getItemY() + getItemHeight()); 

   if (mCurrentView.getTag() != null) {
    int listIndex = (Integer) mCurrentView.getTag();
    int index = (listIndex - maxItemCount + mAdapter.getCount())
      % mAdapter.getCount();
    mAdapter.bindView(mCurrentView, mAdapter.get(index));
    mCurrentView.setTag(index);
   } 

   mNextIndex = mCurrentIndex;
   mCurrentIndex = mPreIndex;
   mPreIndex--;
   if (mPreIndex < 0) {
    mPreIndex = maxItemCount - 1;
   }
   mCurrentView = getChildAt(mCurrentIndex);
   mPreView = getChildAt(mPreIndex);
   mNextView = getChildAt(mNextIndex);
   moveToPre();
  }
 } 

 @Override
 public boolean onDown(MotionEvent e) {
  return true;
 } 

 @Override
 public void onShowPress(MotionEvent e) {
 } 

 @Override
 public boolean onSingleTapUp(MotionEvent e) {
  return false;
 } 

 @Override
 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
   float distanceY) {
  return false;
 } 

 @Override
 public void onLongPress(MotionEvent e) {
 } 

 public int getMaxItemCount() {
  return maxItemCount;
 } 

 public void setMaxItemCount(int maxItemCount) {
  this.maxItemCount = maxItemCount;
 } 

 public void setReLayout(boolean reLayout) {
  this.reLayout = reLayout;
 } 

 public void setCanScroll(boolean canScroll) {
  this.canScroll = canScroll;
 } 

 public int getItemX() {
  return itemX;
 } 

 public void setItemX(int itemX) {
  this.itemX = itemX;
 } 

 public int getItemY() {
  return itemY;
 } 

 public void setItemY(int itemY) {
  this.itemY = itemY;
 } 

 public int getItemWidth() {
  return itemWidth;
 } 

 public void setItemWidth(int itemWidth) {
  this.itemWidth = itemWidth;
 } 

 public int getItemHeight() {
  return itemHeight;
 } 

 public void setItemHeight(int itemHeight) {
  this.itemHeight = itemHeight;
 } 

 public int getItemMargin() {
  return (screenWidth - itemWidth * (maxItemCount - 1) - initItemX * 2)/(maxItemCount - 2) + itemWidth;
 } 

 public int getScreenWidth() {
  return screenWidth;
 } 

 public void setScreenWidth(int screenWidth) {
  this.screenWidth = screenWidth;
 } 

 public int getInitItemX() {
  return initItemX;
 } 

 public void setInitItemX(int initItemX) {
  this.initItemX = initItemX;
 } 

 /**
  * The interface for item click callback.
  */
 interface OnItemClickListener {
  public boolean onItemClick(int position);
 } 

} 

CycleScrollAdapter.java

package com.example.test; 

import java.util.List; 

import android.app.Activity;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.View; 

public abstract class CycleScrollAdapter<T> { 

 private List<T> list;
 private CycleScrollView<T> mCycleScrollView;
 Context mContext; 

 /**
  * Initial CycleScrollAdapter bind list to view.
  *
  * @param list
  *   The list data.
  * @param cycleScrollView
  *   The CycleScrollView.
  * @param context
  *   The Context.
  */
 public CycleScrollAdapter(List<T> list, CycleScrollView<T> cycleScrollView,
   Context context) {
  this.list = list;
  mContext = context;
  mCycleScrollView = cycleScrollView;
  mCycleScrollView.setAdapter(this);
  GetScreenWidthPixels();
  initView(list);
 } 

 /**
  * Get screen width pixels.
  */
 private void GetScreenWidthPixels() {
  DisplayMetrics dm = new DisplayMetrics();
  Activity a = (Activity) mContext;
  a.getWindowManager().getDefaultDisplay().getMetrics(dm);
  mCycleScrollView.setScreenWidth(dm.widthPixels);
 } 

 /**
  * Bind list to view.
  *
  * @param list
  *   The list data.
  */
 protected void initView(List<T> list) {
  if (list == null || list.size() == 0) {
   return;
  } 

  // Clear all view from ViewGroup at first.
  mCycleScrollView.removeAllViewsInLayout(); 

  // Loop list.
  for (int i = 0; i < list.size(); i++) {
   /**
    * If list size more than MaxItemCount break the loop, only create
    * view count is MaxItemCount.
    */
   if (i == mCycleScrollView.getMaxItemCount()) {
    break;
   } 

   /**
    * If list size less than MaxItemCount at the last loop reLayout
    * otherwise at the MaxItemCount index reLayout.
    */
   if (i == list.size() - 1
     || i == mCycleScrollView.getMaxItemCount() - 1) {
    mCycleScrollView.setItemX(mCycleScrollView.getInitItemX());
    mCycleScrollView.setReLayout(true);
   }
   add(list.get(i), i);
  } 

  /**
   * If list count more than MaxItemCount the view can scroll otherwise
   * can not scroll.
   */
  if (list.size() >= mCycleScrollView.getMaxItemCount()) {
   mCycleScrollView.setCanScroll(true);
  } else {
   mCycleScrollView.setCanScroll(false);
  } 

  /**
   * If list count more than MaxItemCount reBuild index.
   */
  mCycleScrollView.createIndex();
 } 

 /**
  * Get list size.
  *
  * @return The list size.
  */
 public int getCount() {
  return list.size();
 } 

 /**
  * Returns the element at the specified location in this
  *
  * @param index
  *   the index of the element to return.
  * @return the element at the specified location.
  */
 public T get(int index) {
  return list.get(index);
 } 

 /**
  * Adds the specified object at the end of this and refresh view.
  *
  * @param t
  *   the object to add.
  */
 public void addItem(T t) {
  list.add(t);
  initView(list);
 } 

 /**
  * Removes the first occurrence of the specified object from this and
  * refresh view.
  *
  * @param t
  *   the object to remove.
  */
 public void removeItem(T t) {
  list.remove(t);
  initView(list);
 } 

 /**
  * Add the specified view to the index.
  *
  * @param t
  *   The data to add.
  * @param index
  *   the index.
  */
 private void add(T t, int index) {
  View view = getView(t);
  ComputeItemSize(view);
  mCycleScrollView.addView(view);
  view.setTag(index);
 } 

 /**
  * If item size is null compute item size.
  *
  * @param view
  *   the item view.
  */
 private void ComputeItemSize(View view) {
  if (mCycleScrollView.getItemWidth() == 0
    || mCycleScrollView.getItemHeight() == 0) {
   int w = View.MeasureSpec.makeMeasureSpec(0,
     View.MeasureSpec.UNSPECIFIED);
   int h = View.MeasureSpec.makeMeasureSpec(0,
     View.MeasureSpec.UNSPECIFIED);
   view.measure(w, h);
   int height = view.getMeasuredHeight();
   int width = view.getMeasuredWidth();
   mCycleScrollView.setItemHeight(height);
   mCycleScrollView.setItemWidth(width);
  }
 } 

 /**
  * Get item view.
  *
  * @param t
  *   the data need bind to view.
  * @return the view.
  */
 public abstract View getView(T t); 

 /**
  * Bind the item to view.
  *
  * @param child
  *   the item view need bind.
  * @param t
  *   the item.
  */
 public abstract void bindView(View child, T t);
}

以上两个是核心类,下面是测试代码。

实现CycleScrollAdapter

AppCycleScrollAdapter.java绑定视图和应用数据

package com.example.test; 

import java.util.List; 

import android.content.Context;
import android.content.pm.PackageInfo;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView; 

public class AppCycleScrollAdapter extends CycleScrollAdapter<PackageInfo> { 

 public AppCycleScrollAdapter(List<PackageInfo> list,
   CycleScrollView<PackageInfo> cycleScrollView, Context context) {
  super(list, cycleScrollView, context);
 } 

 @Override
 protected void initView(List<PackageInfo> list) {
  super.initView(list);
 } 

 @Override
 public void bindView(View child, PackageInfo pi) {
  ImageView image = (ImageView) child.findViewById(R.id.item_image);
  TextView text = (TextView) child.findViewById(R.id.item_text);
  image.setImageDrawable(pi.applicationInfo.loadIcon(mContext
    .getPackageManager()));
  text.setText(pi.applicationInfo.loadLabel(mContext.getPackageManager()));
 } 

 @Override
 public View getView(PackageInfo pi) {
  View view = View.inflate(mContext, R.layout.view_item, null);
  // inflate APP icon view
  ImageView image = (ImageView) view.findViewById(R.id.item_image);
  // inflate APP name view
  TextView text = (TextView) view.findViewById(R.id.item_text);
  image.setImageDrawable(pi.applicationInfo.loadIcon(mContext
    .getPackageManager()));
  text.setText(pi.applicationInfo.loadLabel(mContext.getPackageManager()));
  return view;
 }
}

入口Activity

package com.example.test; 

import java.util.List; 

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.view.Menu; 

public class MainActivity extends Activity{ 

 private CycleScrollView<PackageInfo> mCycleScrollView;
 private AppCycleScrollAdapter mAdapter; 

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main); 

  mCycleScrollView = ((CycleScrollView<PackageInfo>) this.findViewById(R.id.cycle_scroll_view)); 

  /**
   * Get APP list and sort by update time.
   */
  List<PackageInfo> list = this.getPackageManager()
    .getInstalledPackages(0); 

  mAdapter = new AppCycleScrollAdapter(list, mCycleScrollView, this); 

 } 

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 } 

}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 > 

 <ImageView
  android:id="@+id/item_image"
  android:layout_width="60dip"
  android:layout_height="60dip"
  android:layout_y="5dip"
  android:layout_x="10dip"
   /> 

 <TextView
  android:id="@+id/item_text"
  android:layout_width="80dip"
  android:layout_height="20dip"
  android:layout_y="65dip"
  android:layout_x="0dip"
  android:gravity="center_horizontal" /> 

</AbsoluteLayout>
[java] view plain copy
<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" > 

 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerHorizontal="true"
  android:layout_centerVertical="true"
  android:text="@string/hello_world"
  tools:context=".MainActivity" /> 

  <com.example.test.CycleScrollView
  android:id="@+id/cycle_scroll_view"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#B9000000"
  /> 

</RelativeLayout> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-12-28

Android使用RecyclerView实现水平滚动控件

前言 相信大家都知道Android滚动控件的实现方式有很多, 使用RecyclerView也比较简单. 做了一个简单的年龄滚动控件, 让我们来看看RecyclerView的使用方式, 主要有以下几点: (1) 对齐控件中心位置. (2) 计算滚动距离. (3) 高亮中心视图. (4) 实时显示中心数据. (5) 停止时自动对齐. (6) 滚动时, 设置按钮状态开关. 效果 1. 框架 主要关注RecyclerView部分逻辑. /** * 初始化年龄滑动条 */ private void ini

Android中实现多行、水平滚动的分页的Gridview实例源码

功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现. (2)水平滚动翻页,下面有显示当前页的icon. 1.实现自定义的HorizontalScrollView(HorizontalScrollView.java): 因为要翻页时需要传当前页给调用者,所以fling函数中自己

Android实现Activity水平和垂直滚动条的方法

本文实例讲述了Android实现Activity水平和垂直滚动条的方法.分享给大家供大家参考,具体如下: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="

Android使用Recyclerview实现图片水平自动循环滚动效果

简介: 本篇博客主要介绍的是如何使用RecyclerView实现图片水平方向自动循环(跑马灯效果) 效果图:  思路: 1.准备m张图片 1.使用Recyclerview实现,返回无数个(实际Interge.MAXVALUE)item,第n个item显示第n%m张图片 3.使用recyclerview.scrollBy  每个一段时间水平滚动一段距离 4.通过layoutManager.findFirstVisibleItemPosition()获取当前显示的第一个View是第几个item,上面

详解Android使GridView横向水平滚动的实现方式

Android为我们提供了竖直方向的滚动控件GridView,但如果我们想让它水平滚动起来,就需要自己实现了. 以下使用的测试数据datas集合都为List<ResolveInfo>类型,用来存储手机中的所有App public static List<ResolveInfo> getAppData(Context context) { PackageManager packageManager = context.getPackageManager(); Intent mainI

Android开发实现自定义水平滚动的容器示例

本文实例讲述了Android开发实现自定义水平滚动的容器.分享给大家供大家参考,具体如下: public class HorizontalScrollView extends ViewGroup { //手势 private GestureDetector mGestureDetector; private HorizontalScroller mScroller; private int curID; //快速滑动 private boolean isFlying; //--回调函数-----

android listview 水平滚动和垂直滚动的小例子

网上有很多解决 android listview 水平和垂直滚动的代码,我没有按照他们说的做(以前没搜到 O(∩_∩)O~) 我采用的是添加HorizontalScrollViewJava代码 复制代码 代码如下: < ScrollView android:id="@+id/ScrollView01" android:layout_height="300px" android:layout_x="16px" android:layout_y

Android 取得状态栏、任务栏高度的小例子

复制代码 代码如下: package com.aslibra.test; import android.app.Activity; import android.graphics.Rect; import android.os.Bundle; import android.util.Log; import android.view.Window; import android.widget.ImageView; public class test extends Activity {   Ima

Android调用系统的发邮件功能的小例子

复制代码 代码如下: package com.example.myapi.email; import java.util.ArrayList;import java.util.List; import android.content.Context;import android.content.Intent;import android.net.Uri; public class SendEmailUtils {    private SendEmailUtils(){}    private

android中sqlite的按条件查找的小例子

name      hobby Tom        football Peter       basketball 我们如果要查找爱好是football的一行数据怎么办呢?在网上找了很多方法,感觉都说不到点子上,所以浪费了很多时间,好在终于解决了,解决方法如下 [java] 复制代码 代码如下: Cursor mcursor=mSQLiteDatabase.query(tableName, new String[]{"id as _id","name","

Android 图像处理(类型转换,比例缩放,倒影,圆角)的小例子

1.放大缩小图片 复制代码 代码如下: public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){            int width = bitmap.getWidth();            int height = bitmap.getHeight();            Matrix matrix = new Matrix();            float scaleWidht = ((float)w / w

Android获取屏幕方向及键盘状态的小例子

复制代码 代码如下: Configuration config = getResources().getConfiguration(); if (config.orientation == Configuration.ORIENTATION_LANDSCAPE){ //横屏,比如 480x320 }else if(config.orientation == Configuration.ORIENTATION_PORTRAIT){ //竖屏 ,标准模式 320x480 }else if(confi

Android中TextView实现垂直滚动和上下滚动效果

布局里面就是两个自定义的TextView,上面的左右滑动的是AutoHorizontalScrollTextView; 下面上下滚动的是AutoVerticalScrollTextView; 上面左右滑动的非常好实现,直接把AutoHorizontalScrollTextView复制到项目中,复制全类名到布局文件中,和系统TextView一样,只需设置文本其他什么都不用设置: 下面垂直滚动的AutoVerticalScrollTextView相比AutoHorizontalScrollTextV

Android编程实现类似天气预报图文字幕垂直滚动效果的方法

本文实例讲述了Android编程实现类似天气预报图文字幕垂直滚动效果的方法.分享给大家供大家参考,具体如下: 在很多天气或者新闻的应用中,我们都能看到一些字幕滚动的效果,最简单的实现为跑马灯效果,用系统提供的属性即可实现. 复杂一些的就需要自己去用自定义控件实现. 比如 让TextView 实现垂直滚动. 这里我要讲的是垂直滚动的字幕效果,并且内容并不仅为文字,还可以加入图片或者其他元素. 废话不多说,还是直接上效果图: 首先还是看一下核心的实现: 目前我的做法是重写了ScrollView,对外

实现网页内容水平或垂直滚动的Javascript代码

主要两个部分,一.是滚动内容部分:二.JS的滚动代码部分,也只有两句话. 一.传统的滚动代码 用Javascript实现新闻内容的水平滚动! [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 传统的滚动代码应用效果比较单一,而且经常还存在浏览器的兼容性问题,比如在FIREFOX上效果就会出现marquee的特效无效的问题. 二.Javascript实现的滚动效果 用Javascript实现新闻内容的水平滚动1 document.write("用Javascript实现新闻内容的水平滚动

jquery实现marquee效果(文字或者图片的水平垂直滚动)

原本在前端html代码中,实现文字或者图片的水平垂直滚定,都是使用的marquee,但随着考虑浏览器的兼容性和符合为w3c的标准,后来想想那还是使用javascript代码来实现.后来又喜欢上了jquery,下面写的内容希望对初学者有些帮助,高手勿喷,但欢迎指导,感激不尽. 原理:无缝滚动的原理,就是利用两个内容相同的容器,来达到欺骗人的视觉的效果.然后通过整个大容器滚动条的左右或者上下的移动来实现滚动.下面附上一张手绘的图,来简要阐述下原理.首先,我们的目的是实现框1中的内容水平向左滚动(向右