关于Android3.0以后增加的StackView控件的小理解

来源:互联网 发布:什么软件照相好看 编辑:程序博客网 时间:2024/06/05 10:02

1,配置文件.xml文件中的属性,目前只知道两个

<com.youku.widget.YoukuHomePageStackView
        android:id="@+id/homepage_stackview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:loopViews="true"
        android:layerType="hardware"

         />

       android:loopViews:控制是否是轮播效果,能被翻动的,设置为true,就可以被翻动;设置为false,就不能被翻动。。

       android:layerType:是设置是否是硬件加速的问题,是为解决布局StackView是在ActionBar下面,自动轮播时候,每一个StackView的Item会翻上来遮挡ActionBar。

                                        还有none,这个是默认属性,这个属性就是不进行硬件加速;还有software,这是硬件加速中的软件加速属性,据说如果手机不支持hardware,那么这个

属性自动会变成software属性。。。。

2,重写StackView控件

package com.youku.widget;


import java.util.Timer;


import java.util.TimerTask;


import com.youku.util.Logger;


import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.StackView;
import android.support.v4.view.ViewPager;
@SuppressLint("NewApi")
public class YoukuHomePageStackView extends StackView {
public static final String TAG = "LXF";

float dispatchDownXDistance = 0;
float dispatchUpXDistance = 0;
float dispatchDownYDistance = 0;
float dispatchUpYDistance = 0;
private boolean isAutoSlideMode;
private Timer timer;
private TimerTask task;
private static final int MSG_SLIDE = 10000110;
private static final int PERIOD = 5000;

private ViewPager viewPagerFragment;

private Handler handler = new Handler(){


@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_SLIDE:
showNext();
sendEmptyMessageDelayed(MSG_SLIDE, PERIOD);
break;


default:
break;
}
}

};

public YoukuHomePageStackView(Context context, AttributeSet attrs) {
super(context, attrs);

}


@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
Logger.lxf("====onWindowVisibility===visibility===="+visibility);
if(visibility == View.VISIBLE) {
startAutoSlide();
} else {
cancleTask();
}
}
//自动轮播方法,使用handler来实现自动轮播
public void startAutoSlide() {
cancleTask();
handler.sendEmptyMessageDelayed(MSG_SLIDE, PERIOD);
// isAutoSlideMode = true;
// if (timer == null) {
// timer = new Timer();
// task = null;
// task = new TimerTask() {
//
// @Override
// public void run() {
// // F.ot("prove i'm live");
// Message m = Message.obtain();
// m.what = MSG_SLIDE;
// handler.sendMessage(m);
// }
// };
// }
// timer.schedule(task, PERIOD, PERIOD);
}

public void cancleTask(){
handler.removeMessages(MSG_SLIDE);
// if(null!=timer){
// timer.cancel();
// timer.purge();
// timer = null;
// }
//
// if(null!=task){
// task.cancel();
// task = null;
// }
}

public void removeAllView(){
removeAllViews();
}


//监听这个方法主要是为了在ViewPager和StackView之间的事件点击之间冲突问题。。。

//当StackView被点击的时候,会触发dispatchTouchEvent()中的Action_DOWN动作,此时requestDisallowInterceptTouchEvent()设置为true,则此时ViewPager不会被触发,只有StackView才能被触发。。。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = ev.getAction();


        switch(action){


        case MotionEvent.ACTION_DOWN:
        viewPagerFragment = (ViewPager)getParent().getParent().getParent().getParent().getParent().getParent().getParent();
        dispatchDownXDistance = ev.getX();
        dispatchDownYDistance = ev.getY();
        cancleTask();
        getParent().requestDisallowInterceptTouchEvent(true);
//           return true;
             break;
        case MotionEvent.ACTION_MOVE:
             break;
        case MotionEvent.ACTION_UP:
        dispatchUpXDistance = ev.getX();
        dispatchUpYDistance = ev.getY();
        float distanceMoveOne = dispatchUpXDistance-dispatchDownXDistance;
        float distanceMoveTwo = dispatchDownXDistance-dispatchUpXDistance;
        float distanceMoveY = dispatchUpYDistance-dispatchDownYDistance;
//             Logger.lxf("distanceMoveY=="+distanceMoveY);
//             Logger.lxf("Math distanceMoveY=="+Math.abs(distanceMoveY));
//             Logger.lxf("Math distanceMoveOne=="+Math.abs(distanceMoveOne));
             getParent().requestDisallowInterceptTouchEvent(false);
             startAutoSlide();
             if(distanceMoveOne>100&&Math.abs(distanceMoveY)<30){
            //向左滑动
            viewPagerFragment.setCurrentItem(1);
             
            return false;
             }else if(distanceMoveTwo>100&&Math.abs(distanceMoveY)<30){
            //向右滑动
            viewPagerFragment.setCurrentItem(3);
            return false;
             }
             break;
        case MotionEvent.ACTION_CANCEL:
        startAutoSlide();
             break;
        }
return super.dispatchTouchEvent(ev);
}


}