/* * Copyright (C) 2012 www.amsoft.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ab.view.sliding; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.ScrollView; import com.ab.adapter.AbViewPagerAdapter; import com.ab.util.AbFileUtil; import com.ab.util.AbViewUtil; import com.ab.view.sample.AbInnerViewPager; // TODO: Auto-generated Javadoc /** * © 2012 amsoft.cn * 名称:AbPlayView * 描述:可播放显示的View. * * @author 还如一梦中 * @version * @date 2011-11-28 */ public class AbSlidingPlayView extends LinearLayout { /** 上下文. */ private Context context; /** 内部的ViewPager. */ private AbInnerViewPager mViewPager; /** 导航的布局. */ private LinearLayout navLinearLayout; /** 导航布局参数. */ public LinearLayout.LayoutParams navLayoutParams = null; /** 计数. */ private int count, position; /** 导航图片. */ private Drawable displayDrawable; private Drawable hideDrawable; /** 点击. */ private AbOnItemClickListener mOnItemClickListener; /** 改变. */ private AbOnChangeListener mAbChangeListener; /** 滚动. */ private AbOnScrollListener mAbScrolledListener; /** 触摸. */ private AbOnTouchListener mAbOnTouchListener; /** List views. */ private ArrayList<View> mListViews = null; /** 适配器. */ private AbViewPagerAdapter mAbViewPagerAdapter = null; /** 导航的点父View. */ private LinearLayout mNavLayoutParent = null; /** 导航内容的对齐方式. */ private int navHorizontalGravity = Gravity.RIGHT; /** 播放的方向. */ private int playingDirection = 0; /** 播放的开关. */ private boolean play = false; /** * 创建一个AbSlidingPlayView. * * @param context the context */ public AbSlidingPlayView(Context context) { super(context); initView(context); } /** * 从xml初始化的AbSlidingPlayView. * * @param context the context * @param attrs the attrs */ public AbSlidingPlayView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } /** * 描述:初始化这个View. * * @param context the context */ public void initView(Context context){ this.context = context; navLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); this.setOrientation(LinearLayout.VERTICAL); RelativeLayout mRelativeLayout = new RelativeLayout(context); mViewPager = new AbInnerViewPager(context); //手动创建的ViewPager,如果用fragment必须调用setId()方法设置一个id mViewPager.setId(1985); //导航的点 mNavLayoutParent = new LinearLayout(context); mNavLayoutParent.setPadding(0,5, 0, 5); navLinearLayout = new LinearLayout(context); navLinearLayout.setPadding(15, 1, 15, 1); navLinearLayout.setVisibility(View.INVISIBLE); mNavLayoutParent.addView(navLinearLayout,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp1.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE); lp1.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE); lp1.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE); mRelativeLayout.addView(mViewPager,lp1); RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE); mRelativeLayout.addView(mNavLayoutParent,lp2); addView(mRelativeLayout,new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); mListViews = new ArrayList<View>(); mAbViewPagerAdapter = new AbViewPagerAdapter(context,mListViews); mViewPager.setAdapter(mAbViewPagerAdapter); mViewPager.setFadingEdgeLength(0); mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { makesurePosition(); onPageSelectedCallBack(position); } @Override public void onPageScrollStateChanged(int state) { } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { onPageScrolledCallBack(position); } }); } /** * 创建导航点. */ public void creatIndex() { //显示下面的点 navLinearLayout.removeAllViews(); mNavLayoutParent.setHorizontalGravity(navHorizontalGravity); navLinearLayout.setGravity(Gravity.CENTER); navLinearLayout.setVisibility(View.VISIBLE); count = mListViews.size(); navLayoutParams.setMargins(5, 5, 5, 5); navLayoutParams.width = 15; navLayoutParams.height = 15; for (int j = 0; j < count; j++) { ImageView imageView = new ImageView(context); imageView.setLayoutParams(navLayoutParams); if (j == 0) { imageView.setImageDrawable(displayDrawable); } else { imageView.setImageDrawable(hideDrawable); } AbViewUtil.scaleView(imageView); navLinearLayout.addView(imageView, j); } } /** * 定位点的位置. */ public void makesurePosition() { position = mViewPager.getCurrentItem(); for (int j = 0; j < count; j++) { if (position == j) { ((ImageView)navLinearLayout.getChildAt(position)).setImageDrawable(displayDrawable); } else { ((ImageView)navLinearLayout.getChildAt(j)).setImageDrawable(hideDrawable); } } } /** * 描述:添加可播放视图. * * @param view the view */ public void addView(View view){ mListViews.add(view); if(view instanceof AbsListView){ }else{ view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(mOnItemClickListener!=null){ mOnItemClickListener.onClick(position); } } }); view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if(mAbOnTouchListener!=null){ mAbOnTouchListener.onTouch(event); } return false; } }); } mAbViewPagerAdapter.notifyDataSetChanged(); creatIndex(); } /** * 描述:添加可播放视图列表. * * @param views the views */ public void addViews(List<View> views){ mListViews.addAll(views); for(View view:views){ view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(mOnItemClickListener!=null){ mOnItemClickListener.onClick(position); } } }); view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if(mAbOnTouchListener!=null){ mAbOnTouchListener.onTouch(event); } return false; } }); } mAbViewPagerAdapter.notifyDataSetChanged(); creatIndex(); } /** * 描述:删除可播放视图. * */ @Override public void removeAllViews(){ mListViews.clear(); mAbViewPagerAdapter.notifyDataSetChanged(); creatIndex(); } /** * 描述:设置页面切换事件. * * @param position the position */ private void onPageScrolledCallBack(int position) { if(mAbScrolledListener!=null){ mAbScrolledListener.onScroll(position); } } /** * 描述:设置页面切换事件. * * @param position the position */ private void onPageSelectedCallBack(int position) { if(mAbChangeListener!=null){ mAbChangeListener.onChange(position); } } /** 用与轮换的 handler. */ private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what==0) { int count = mListViews.size(); int i = mViewPager.getCurrentItem(); if(playingDirection==0){ if(i == count-1){ playingDirection = -1; i--; }else{ i++; } }else{ if(i == 0){ playingDirection = 0; i++; }else{ i--; } } mViewPager.setCurrentItem(i, true); if(play){ handler.postDelayed(runnable, 5000); } } } }; /** 用于轮播的线程. */ private Runnable runnable = new Runnable() { public void run() { if(mViewPager!=null){ handler.sendEmptyMessage(0); } } }; /** * 描述:自动轮播. */ public void startPlay(){ if(handler!=null){ play = true; handler.postDelayed(runnable, 5000); } } /** * 描述:自动轮播. */ public void stopPlay(){ if(handler!=null){ play = false; handler.removeCallbacks(runnable); } } /** * 设置点击事件监听. * * @param onItemClickListener the new on item click listener */ public void setOnItemClickListener(AbOnItemClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; } /** * 描述:设置页面切换的监听器. * * @param abChangeListener the new on page change listener */ public void setOnPageChangeListener(AbOnChangeListener abChangeListener) { mAbChangeListener = abChangeListener; } /** * 描述:设置页面滑动的监听器. * * @param abScrolledListener the new on page scrolled listener */ public void setOnPageScrolledListener(AbOnScrollListener abScrolledListener) { mAbScrolledListener = abScrolledListener; } /** * 描述:设置页面Touch的监听器. * * @param abOnTouchListener the new on touch listener */ public void setOnTouchListener(AbOnTouchListener abOnTouchListener){ mAbOnTouchListener = abOnTouchListener; } /** * 设置页的指示图标 * * @param displayDrawable 选择状态图 * @param hideDrawable 未选择状态图 */ public void setNavPageResources(int displayResId,int hideResId) { this.displayDrawable = this.getResources().getDrawable(displayResId); this.hideDrawable = this.getResources().getDrawable(hideResId); creatIndex(); } /** * 描述:获取这个滑动的ViewPager类. * * @return the view pager */ public ViewPager getViewPager() { return mViewPager; } /** * 描述:获取当前的View的数量. * * @return the count */ public int getCount() { return mListViews.size(); } /** * 描述:设置页显示条的位置,在AddView前设置. * * @param horizontalGravity the nav horizontal gravity */ public void setNavHorizontalGravity(int horizontalGravity) { navHorizontalGravity = horizontalGravity; } /** * 如果外层有ScrollView需要设置. * * @param parentScrollView the new parent scroll view */ public void setParentScrollView(ScrollView parentScrollView) { this.mViewPager.setParentScrollView(parentScrollView); } /** * 如果外层有ListView需要设置. * * @param parentListView the new parent list view */ public void setParentListView(ListView parentListView) { this.mViewPager.setParentListView(parentListView); } /** * 描述:设置导航点的背景. * * @param resid the new nav layout background */ public void setNavLayoutBackground(int resid){ navLinearLayout.setBackgroundResource(resid); } /** * 监听器. * * @see AbOnChangeEvent */ public interface AbOnChangeListener { /** * 改变. * @param position the position */ public void onChange(int position); } /** * 条目点击接口. * * @see AbOnItemClickEvent */ public interface AbOnItemClickListener { /** * 描述:点击事件. * @param position 索引 */ public void onClick(int position); } /** * 滚动. * * @see AbOnScrollEvent */ public interface AbOnScrollListener { /** * 滚动. * @param arg1 返回参数 */ public void onScroll(int arg1); /** * 滚动停止. */ public void onScrollStoped(); /** * 滚到了最左边. */ public void onScrollToLeft(); /** * 滚到了最右边. */ public void onScrollToRight(); } /** * 触摸屏幕接口. * * @see AbOnTouchEvent */ public interface AbOnTouchListener { /** * 描述:Touch事件. * * @param event 触摸手势 */ public void onTouch(MotionEvent event); } }