/* * Copyright (C) 2013 www.418log.org * * 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.Color; 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.global.AbAppData; import com.ab.util.AbFileUtil; import com.ab.view.listener.AbOnChangeListener; import com.ab.view.listener.AbOnItemClickListener; import com.ab.view.listener.AbOnScrollListener; import com.ab.view.listener.AbOnTouchListener; import com.ab.view.sample.AbInnerViewPager; // TODO: Auto-generated Javadoc /** * 名称:AbPlayView * 描述:可播放显示的View. * * @author zhaoqp * @date 2011-11-28 * @version */ public class AbSlidingPlayView extends LinearLayout { /** The tag. */ private static String TAG = "AbSlidingPlayView"; /** The Constant D. */ private static final boolean D = AbAppData.DEBUG; /** The context. */ private Context context; /** The m view pager. */ private AbInnerViewPager mViewPager; /** The page line layout. */ private LinearLayout pageLineLayout; /** The layout params pageLine. */ public LinearLayout.LayoutParams pageLineLayoutParams = null; /** The i. */ private int count, position; /** The hide image. */ private Bitmap displayImage, hideImage; /** The m on item click listener. */ private AbOnItemClickListener mOnItemClickListener; /** The m ab change listener. */ private AbOnChangeListener mAbChangeListener; /** The m ab scrolled listener. */ private AbOnScrollListener mAbScrolledListener; /** The m ab touched listener. */ private AbOnTouchListener mAbOnTouchListener; /** The layout params ff. */ public LinearLayout.LayoutParams layoutParamsFF = null; /** The layout params fw. */ public LinearLayout.LayoutParams layoutParamsFW = null; /** The layout params wf. */ public LinearLayout.LayoutParams layoutParamsWF = null; /** The m list views. */ private ArrayList<View> mListViews = null; /** The m ab view pager adapter. */ private AbViewPagerAdapter mAbViewPagerAdapter = null; /**导航的点父View*/ private LinearLayout mPageLineLayoutParent = null; /** The page line horizontal gravity. */ private int pageLineHorizontalGravity = Gravity.RIGHT; /**播放的方向*/ private int playingDirection = 0; /**播放的开关*/ private boolean play = false; /** * 创建一个AbSlidingPlayView * @param 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 * @throws */ public void initView(Context context){ this.context = context; layoutParamsFF = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); layoutParamsFW = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); layoutParamsWF = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT); pageLineLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); this.setOrientation(LinearLayout.VERTICAL); this.setBackgroundColor(Color.rgb(255, 255, 255)); RelativeLayout mRelativeLayout = new RelativeLayout(context); mViewPager = new AbInnerViewPager(context); //手动创建的ViewPager,如果用fragment必须调用setId()方法设置一个id mViewPager.setId(1985); //导航的点 mPageLineLayoutParent = new LinearLayout(context); mPageLineLayoutParent.setPadding(0,5, 0, 5); pageLineLayout = new LinearLayout(context); pageLineLayout.setPadding(15, 1, 15, 1); pageLineLayout.setVisibility(View.INVISIBLE); mPageLineLayoutParent.addView(pageLineLayout,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(mPageLineLayoutParent,lp2); addView(mRelativeLayout,layoutParamsFW); displayImage = AbFileUtil.getBitmapFormSrc("image/play_display.png"); hideImage = AbFileUtil.getBitmapFormSrc("image/play_hide.png"); 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() { //显示下面的点 pageLineLayout.removeAllViews(); mPageLineLayoutParent.setHorizontalGravity(pageLineHorizontalGravity); pageLineLayout.setGravity(Gravity.CENTER); pageLineLayout.setVisibility(View.VISIBLE); count = mListViews.size(); for (int j = 0; j < count; j++) { ImageView imageView = new ImageView(context); pageLineLayoutParams.setMargins(5, 5, 5, 5); imageView.setLayoutParams(pageLineLayoutParams); if (j == 0) { imageView.setImageBitmap(displayImage); } else { imageView.setImageBitmap(hideImage); } pageLineLayout.addView(imageView, j); } } /** * 定位点的位置. */ public void makesurePosition() { position = mViewPager.getCurrentItem(); for (int j = 0; j < count; j++) { if (position == j) { ((ImageView)pageLineLayout.getChildAt(position)).setImageBitmap(displayImage); } else { ((ImageView)pageLineLayout.getChildAt(j)).setImageBitmap(hideImage); } } } /** * 描述:添加可播放视图. * * @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 * @throws */ public void setOnTouchListener(AbOnTouchListener abOnTouchListener){ mAbOnTouchListener = abOnTouchListener; } /** * Sets the page line image. * * @param displayImage the display image * @param hideImage the hide image */ public void setPageLineImage(Bitmap displayImage,Bitmap hideImage) { this.displayImage = displayImage; this.hideImage = hideImage; 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 new page line horizontal gravity */ public void setPageLineHorizontalGravity(int horizontalGravity) { pageLineHorizontalGravity = 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 * @throws */ public void setPageLineLayoutBackground(int resid){ pageLineLayout.setBackgroundResource(resid); } }