用ViewGroup實現左右滾動

2021-06-19 00:17:39 字數 3206 閱讀 3015

import android.content.context;

import android.graphics.canvas;

import android.util.attributeset;

import android.util.log;

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;

public class scollgroup extends viewgroup implements ongesturelistener

public scollgroup(context context)

/*** 設定指示控制器

* @param indicatorcontrol 指示控制器

*/public void setindicatorcontrol(indicatorcontrol indicatorcontrol)

}/**

* 計算每個子控制項的位置

*/@override

protected void onlayout(boolean changed, int l, int t, int r, int b)

}@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

}@override

public boolean onintercepttouchevent(motionevent event)

log.d(tag, "onintercepttouchevent => " + event.getaction());

return true;

}@override

public boolean ontouchevent(motionevent event)

mstatus = touch_status_moving;

mlastposx = mcurrentposx;

mdownposx = x;

case motionevent.action_move:

log.d(tag, "ontouchevent => action_move");

//計算當前滾動到的座標

mcurrentposx = mlastposx + mdownposx - x;

//螢幕第一屏和最後一屏越界不能超過10

mcurrentposx = math.max(

math.min(mcurrentposx, (getchildcount() - 1)

* getmeasuredwidth() + screen_offset), -screen_offset);

// log.d(tag, "mcurrentx = " + mcurrentposx + "; mdownposx = " + mdownposx + "; x = " + x);

scrollto(mcurrentposx, 0);

break;

case motionevent.action_up:

log.d(tag, "ontouchevent => action_up");

//計算當前滾動到的螢幕,如果已觸發fling事件,則不用計算當前螢幕,因為已在onfling事件中計算出來了

if(mstatus != touch_status_fling)

mcurrentscreen = calculatescreen(mcurrentposx);

// log.d(tag, "mcurrentscreen = " + mcurrentscreen);

scrollto(mcurrentscreen);

break;

}return true;

}/**

* 將控制項滾動到指定subview

* @param screenindex

*/public void scrollto(int screenindex)

@override

public void computescroll() else if(mstatus == touch_status_scrolling) }}

/*** 通過當前所在座標計算出螢幕屬於哪一屏

* @param curpos 當前座標

*/private int calculatescreen(int curpos)

return math.min(math.max(0, curscreen), getchildcount() - 1);

}@override

public boolean onfling(motionevent e1, motionevent e2, float velocityx,

float velocityy) else

return false;

}public void requestinvalidate(int width)

@override

public boolean ondown(motionevent e)

@override

public void onshowpress(motionevent e)

@override

public boolean onsingletapup(motionevent e)

@override

public boolean onscroll(motionevent e1, motionevent e2, float distancex,

float distancey)

@override

public void onlongpress(motionevent e)

/*** 指示器控制介面

* @author 鄭澍璋

*/public static inte***ce indicatorcontrol

}

繼承ViewGroup實現Scroll滑動效果

extends viewgroup需要重寫onmeasure和onlayout方法 onmeasure方法是去測量viewgroup需要的大小以及包含的子view需要的大小。執行完上面的方法後,再執行onlayout方法去設定子view的擺放位置。android為我們提供了velocitytrack...

用js實現簡單的點選左右運動

如下圖,點選向右,方塊向右移動,點選向左,方塊向左移動。可以用setinterval來實現過多長時間,div移動多長的距離來實現運動效果。要點一 如果元素的左邊距離小於目標距離,則是正向移動,否則是負向移動 if run.offsetleft 要點二 如果元素的左邊距離等於目標距離,停止定時器,否則...

自定義ViewGroup實現寬度自動換行

自定義viewgroup package com.fenghongzhang.day011 import android.content.context import android.graphics.canvas import android.util.attributeset import an...