第一步:
package com.example.example;import android.content.Context;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.DecelerateInterpolator;import android.widget.Scroller;
public class BannerLayout extends ViewGroup { private Scroller scroller; private float mLastMotionX; // private int mTouchSlop; private OnItemClickListener onItemClickListener; private int currentScreenIndex = 0; private boolean moving = false; private boolean autoScroll = false; private int scrollTime = 4 * 1000; private int currentWhat = 0; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (autoScroll && currentWhat == msg.what) { currentScreenIndex = (currentScreenIndex + 1) % getChildCount(); scrollToScreen(currentScreenIndex); Log.i("TAG", "handleMessage scrollToScreen:" + currentScreenIndex); if (autoScroll) handler.sendEmptyMessageDelayed(currentWhat, scrollTime); } } }; public BannerLayout(Context context) { super(context); initView(context); // TODO Auto-generated constructor stub } public BannerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub initView(context); } public BannerLayout(Context context, AttributeSet attrs) { super(context, attrs); initView(context); // TODO Auto-generated constructor stub } private void initView(final Context context) { this.scroller = new Scroller(context, new DecelerateInterpolator(4));// OvershootInterpolator(1.1f) // handler.sendEmptyMessageDelayed(currentWhat, scrollTime); // final ViewConfiguration configuration = ViewConfiguration // .get(getContext()); // mTouchSlop = configuration.getScaledTouchSlop(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec); int maxHeight = -1; final int count = getChildCount(); for (int i = 0; i < count; i++) { getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec); maxHeight = Math.max(maxHeight, getChildAt(i).getMeasuredHeight()); } maxHeight = Math.min(maxHeight, MeasureSpec.getSize(heightMeasureSpec)); Log.e("TAG", "onMeasure Height:" + maxHeight); setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), maxHeight); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { final int count = getChildCount(); int cLeft = 0; for (int i = 0; i < count; i++) { View child = getChildAt(i); if (child.getVisibility() == View.GONE) continue; // child.setVisibility(View.VISIBLE); final int childWidth = child.getMeasuredWidth(); child.layout(cLeft, 0, cLeft + childWidth, child.getMeasuredHeight()); cLeft += childWidth; } } @Override public void computeScroll() { if (scroller.computeScrollOffset()) { scrollTo(scroller.getCurrX(), 0); postInvalidate(); } } @Override public boolean onTouchEvent(MotionEvent ev) { if (getChildCount() == 0) return false; final int action = ev.getAction(); final float x = ev.getX(); switch (action) { case MotionEvent.ACTION_DOWN: autoScroll = false; currentWhat++; mLastMotionX = x; if (!scroller.isFinished()) { scroller.abortAnimation(); } moving = false; // Log.i("TAG","ACTION_DOWN"); return true; case MotionEvent.ACTION_MOVE: final int deltaX = (int) (mLastMotionX - x); boolean xMoved = Math.abs(deltaX) > 4; if (!moving && !xMoved) break; mLastMotionX = x; if ((0 == currentScreenIndex && deltaX < 0) || (getChildCount() - 1 == currentScreenIndex && deltaX > 0)) scrollBy(deltaX / 4, 0); else scrollBy(deltaX, 0); moving = true; { final int screenWidth = getWidth(); currentScreenIndex = (getScrollX() + (screenWidth / 2)) / screenWidth; } return true; case MotionEvent.ACTION_UP: snapToDestination(); if (!autoScroll) { startScroll(); } if (!moving && null != onItemClickListener) { final int screenWidth = getWidth(); int index = (int) ((getScrollX() + x) / screenWidth); onItemClickListener.onClick(index, getChildAt(index)); } break; case MotionEvent.ACTION_CANCEL: snapToDestination(); if (!autoScroll) { startScroll(); } } return false; } private void scrollToScreen(int whichScreen) { // if (!scroller.isFinished()) // return; // Log.e("TAG","scrollToScreen:"+whichScreen); if (whichScreen >= getChildCount()) whichScreen = getChildCount() - 1; int delta = 0; delta = whichScreen * getWidth() - getScrollX(); // scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2); scroller.startScroll(getScrollX(), 0, delta, 0, 1500); invalidate(); currentScreenIndex = whichScreen; } private void snapToDestination() { final int x = getScrollX(); final int screenWidth = getWidth(); scrollToScreen((x + (screenWidth / 2)) / screenWidth); } public int getCurrentScreenIndex() { return currentScreenIndex; } public void startScroll() { autoScroll = true; handler.sendEmptyMessageDelayed(currentWhat, scrollTime); } public boolean isScrolling() { return autoScroll; } public void stopScroll() { autoScroll = false; currentWhat++; } @Override protected void finalize() throws Throwable { Log.e("TAG", "finalize==="); super.finalize(); } public OnItemClickListener getOnItemClickListener() { return onItemClickListener; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public interface OnItemClickListener { public void onClick(int index, View childview); } // OnClickListener onclick;}
第二步:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><com.example.example.BannerLayoutandroid:id="@+id/layout_banner"android:layout_width="match_parent"android:layout_height="wrap_content" ><ImageViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:src="@drawable/gsydgsdfasdqwf" /><ImageViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:src="@drawable/hsfttyodfsd" /><ImageViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:src="@drawable/tsdssbd" /><ImageViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:src="@drawable/sdfdsf" /></com.example.example.BannerLayout></LinearLayout>

第三步:

package com.example.example;import android.os.Bundle;import android.app.Activity;public class MainActivity extends Activity {    private BannerLayout banner;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        banner = (BannerLayout) findViewById(R.id.layout_banner);    }    @Override    protected void onPause() {        banner.stopScroll();        super.onPause();    }    @Override    protected void onRestart() {        if (!banner.isScrolling())            banner.startScroll();        super.onRestart();    }    @Override    protected void onResume() {        if (!banner.isScrolling())            banner.startScroll();        super.onResume();    }    @Override    protected void onStop() {        banner.stopScroll();        super.onStop();    }    @Override    protected void onDestroy() {        banner.stopScroll();        super.onDestroy();    }}

更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. Android(安卓)四大组件之 Service(一)
  2. android地图定位
  3. Android(安卓)android:allowBackup waiti
  4. Android—— 4.2 Vold挂载管理_主体构建m
  5. [Android][SystemUI]navigationbar 3个虚
  6. Android预安装软件&adb命令&编译源码
  7. 81.s1-禁用checkBox点击事件
  8. android驱动学习-led次设备号(2)
  9. Android(安卓)分析:Process xxxxx (pid 30
  10. Android(安卓)准确过滤(禁止) Emoji表情