Ⅰ android 手勢操作中滑動和滾動的區別
滑動一般是左右,滾動是上下,而且滑動操作范圍有限,滾動范圍比較大
Ⅱ android 左右滑屏怎麼實現 哪位大神教教我
代碼如下:
package kexc.scroll;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;
/**
* 仿Launcher中的WorkSapce,可以左右滑動切換屏幕的類
*
*/
public class ScrollLayout extends ViewGroup {
/*
* onMeasure方法在控制項的父元素正要放置它的子控制項時調用。它會問一個問題,「你想要用多大地方啊?」,然後傳入兩個參數——
* widthMeasureSpec和heightMeasureSpec。它們指明控制項可獲得的空間以及關於這個空間描述的元數據。
* 比返回一個結果要好的方法是你傳遞View的高度和寬度到setMeasuredDimension方法里。
* 一個MeasureSpec包含一個尺寸和模式。
* 有三種可能的模式:
* UNSPECIFIED:父布局沒有給子布局任何限制,子布局可以任意大小。
* EXACTLY:父布局決定子布局的確切大小。不論子布局多大,它都必須限制在這個界限里。
* AT_MOST:子布局可以根據自己的大小選擇任意大小。
*/
/*
* VelocityTracker類
*
* 功能: 根據觸摸位置計算每像素的移動速率。
*
* 常用方法有:
*
* public void addMovement (MotionEvent ev) 功能:添加觸摸對象MotionEvent , 用於計算觸摸速率。
* public void computeCurrentVelocity (int units)
* 功能:以每像素units單位考核移動速率。額,其實我也不太懂,賦予值1000即可。 參照源碼 該units的意思如下: 參數 units :
* The units you would like the velocity in. A value of 1 provides pixels
* per millisecond, 1000 provides pixels per second, etc. public float
* getXVelocity () 功能:獲得X軸方向的移動速率。
*/
/*
* ViewConfiguration類
*
* 功能: 獲得一些關於timeouts(時間)、sizes(大小)、distances(距離)的標准常量值 。
*
* 常用方法:
*
* public int getScaledEdgeSlop()
*
* 說明:獲得一個觸摸移動的最小像素值。也就是說,只有超過了這個值,才代表我們該滑屏處理了。
*
* public static int getLongPressTimeout()
*
* 說明:獲得一個執行長按事件監聽(onLongClickListener)的值。也就是說,對某個View按下觸摸時,只有超過了
*
* 這個時間值在,才表示我們該對該View回調長按事件了;否則,小於這個時間點松開手指,只執行onClick監聽
*/
private static final String TAG = "ScrollLayout";
private Scroller mScroller;
private VelocityTracker mVelocityTracker;
private int mCurScreen;//當前屏幕
private int mDefaultScreen = 0;
//兩種狀態: 是否處於滑屏狀態
private static final int TOUCH_STATE_REST = 0;//靜止狀態
private static final int TOUCH_STATE_SCROLLING = 1;//滑屏狀態
private static final int SNAP_VELOCITY = 600; //最小的滑動速率
private int mTouchState = TOUCH_STATE_REST;
private int mTouchSlop;// change 多少像素算是發生move操作
private float mLastMotionX;
private float mLastMotionY;
public ScrollLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
// TODO Auto-generated constructor stub
}
public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
mScroller = new Scroller(context);
mCurScreen = mDefaultScreen;
//初始化一個最小滑動距離
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
/**
* 生成view
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
if (changed) {
int childLeft = 0;
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View childView = getChildAt(i);
if (childView.getVisibility() != View.GONE) {
final int childWidth = childView.getMeasuredWidth();
childView.layout(childLeft, 0, childLeft + childWidth,
childView.getMeasuredHeight());
childLeft += childWidth;
}
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Log.e(TAG, "onMeasure");
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int width = MeasureSpec.getSize(widthMeasureSpec);
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
if (widthMode != MeasureSpec.EXACTLY) {
throw new IllegalStateException(
"ScrollLayout only canmCurScreen run at EXACTLY mode!");
}
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (heightMode != MeasureSpec.EXACTLY) {
throw new IllegalStateException(
"ScrollLayout only can run at EXACTLY mode!");
}
// The children are given the same width and height as the scrollLayout
final int count = getChildCount();
for (int i = 0; i < count; i++) {
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
}
// Log.e(TAG, "moving to screen "+mCurScreen);
scrollTo(mCurScreen * width, 0);
}
/**
* According to the position of current layout scroll to the destination
* page.
*/
public void snapToDestination() {
// 判斷是否超過下一屏的中間位置,如果達到就抵達下一屏,否則保持在原屏幕
// 這樣的一個簡單公式意思是:假設當前滑屏偏移值即 scrollCurX 加上每個屏幕一半的寬度,除以每個屏幕的寬度就是
// 我們目標屏所在位置了。 假如每個屏幕寬度為320dip, 我們滑到了500dip處,很顯然我們應該到達第二屏,索引值為1
// 即(500 + 320/2)/320 = 1
final int screenWidth = getWidth();
final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;
snapToScreen(destScreen);
}
public void snapToScreen(int whichScreen) {
// get the valid layout page
whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
if (getScrollX() != (whichScreen * getWidth())) {
final int delta = whichScreen * getWidth() - getScrollX();
mScroller.startScroll(getScrollX(), 0, delta, 0,
Math.abs(delta) * 5);
mCurScreen = whichScreen;
onScreenChangeListener.onScreenChange(mCurScreen);
invalidate(); // Redraw the layout
}
}
public void setToScreen(int whichScreen) {
whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
mCurScreen = whichScreen;
scrollTo(whichScreen * getWidth(), 0);
}
public int getCurScreen() {
return mCurScreen;
}
/**
* 控制view跟隨手指滑動 由父視圖調用用來請求子視圖根據偏移值 mScrollX,mScrollY重新繪制
*/
@Override
public void computeScroll() {
// 如果返回true,表示動畫還沒有結束
// 因為前面startScroll,所以只有在startScroll完成時 才會為false
if (mScroller.computeScrollOffset()) {
// 產生了動畫效果,根據當前值 每次滾動一點
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}
/*
* 其中:onInterceptTouchEvent()主要功能是控制觸摸事件的分發,例如是子視圖的點擊事件還是滑動事件。
* 其他所有處理過程均在onTouchEvent()方法里實現了。 1、屏幕的滑動要根據手指的移動而移動 ----
* 主要實現在onTouchEvent()方法中
*
Ⅲ Android QQ 左右滑動菜單彈出效果怎麼實現
您好,這個可以使用MD的一些布局,也可以自定義一些空間來實現左劃菜單
這里給你推薦使用DrawerLayout抽屜布局,下面貼上我的代碼
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
<!--這里為Fragment提供布局 -->
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize" />
<include layout="@layout/toolbar" />
</RelativeLayout>
<android.support.design.widget.NavigationView
<!-- 這里是側滑的部分-->
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start" ---------------------1
app:headerLayout="@layout/drawer_header"------2
app:menu="@menu/menu_drawer" />
</android.support.v4.widget.DrawerLayout>
1:start為左側策劃,end為右側側滑
2:這里為qq策劃中上半部分,我在這里直接引用了另一個布局
Ⅳ android中怎麼實現滑動手機屏幕來代替相應的上下左右按鈕
直接上圖,
代碼
有一個問題,首頁就是第二排第二個可以上下滑動,但是在它上面卻不能左右滑動屏幕了,應該是焦點的問題,有大蝦解決了麻煩告知一下,在此謝過
已經解決了,再發一次
Ⅳ 想做一個android的launcher,實現左右滑動屏幕,發現在虛擬機上面只能實現滑鼠滑動,方向鍵不可以切換頁面
沒有添加對左右方向鍵的事件監聽器
Ⅵ android平台中頁面切換時如果要用觸摸屏左右滑動,怎麼實現
左右滑動切換是通過viewPager來實現的,完整代碼查看附件。
ViewPager的數據是通過PageAdapter來裝載的:
1.調用adapter.notifyDataSetChanged(); 刷新控制項,但是要覆蓋PagerAdapter的getItemPosition方法,並返回return POSITION_NONE;
2.利用PagerAdapter的工作機制,就是PagerAdapter的執行順序,PagerAdapter作為ViewPager的適配器,無論ViewPager有多少頁,PagerAdapter在初始化時也只初始化開始的2個View,即調用2次instantiateItem方法。而接下來每當ViewPager滑動時,PagerAdapter都會調用destroyItem方法將距離該頁2個步幅以上的那個View銷毀,以此保證PagerAdapter最多隻管轄3個View,且當前View是3個中的中間一個,如果當前View缺少兩邊的View,那麼就instantiateItem,如里有超過2個步幅的就destroyItem。
3.每當Adapter調用instantiateItem時,運用View.setTag方法將該View標識。當需要更新這個View的數據時,通過調用ViewPager.findViewWithTag方法找到相應的View,然後更新View中的數據。
Ⅶ android 怎樣用HorizontalScrollView左右彈性的菜單
{
SlidingMenumSlidingMenu;
@Override
protectedvoidonCreate(Bundlearg0){
super.onCreate(arg0);
setContentView(R.layout.main);
DisplayMetricsdm=newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
mSlidingMenu=(SlidingMenu)findViewById(R.id.slidingMenu);
mSlidingMenu.setAlignScreenWidth((dm.widthPixels/5)*2);
ViewleftView=getLayoutInflater().inflate(R.layout.left_menu,null);
ViewrightView=getLayoutInflater().inflate(R.layout.right_menu,null);
ViewcenterView=getLayoutInflater().inflate(R.layout.center,null);
mSlidingMenu.setLeftView(leftView);
mSlidingMenu.setRightView(rightView);
mSlidingMenu.setCenterView(centerView);
ButtonshowLeftMenu=(Button)centerView.findViewById(R.id.center_left_btn);
showLeftMenu.setOnClickListener(this);
ButtonshowRightMenu=(Button)centerView.findViewById(R.id.center_right_btn);
showRightMenu.setOnClickListener(this);
}
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
switch(v.getId()){
caseR.id.center_left_btn:
mSlidingMenu.showLeftView();
break;
caseR.id.center_right_btn:
mSlidingMenu.showRightView();
break;
default:
break;
}
}
}
Ⅷ 如何在Android中實現漸顯按鈕的左右滑動效果
MainActivity文件中代碼:
package com.android.buttonpageflipper;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;
import android.widget.ViewFlipper;
/**
* Android實現帶漸顯按鈕的左右滑動效果
* 自然狀態下按鈕不可見,觸摸屏幕時顯示按鈕
* @author Administrator
*
*/
public class MainActivity extends Activity {
//聲明兩個按鈕,分別代表向左和向右滑動
private ImageView btnLeft=null;
private ImageView btnRight=null;
//設置WindowManager
private WindowManager wm=null;
private WindowManager.LayoutParams wmParams=null;
//ImageView的alpha值
private int mAlpha = 0;
private boolean isHide;
private ViewFlipper viewFlipper = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setTitle("Android實現漸顯按鈕的左右滑動效果");
viewFlipper = (ViewFlipper) this.findViewById(R.id.myViewFlipper);
//初始化左右按鈕
initImageButtonView();
}
/**
* 初始化懸浮按鈕
*/
private void initImageButtonView(){
//獲取WindowManager
wm=(WindowManager)getApplicationContext().getSystemService("window");
//設置LayoutParams相關參數
wmParams = new WindowManager.LayoutParams();
//設置window type
wmParams.type=LayoutParams.TYPE_PHONE;
//設置圖片格式,效果為背景透明
wmParams.format=PixelFormat.RGBA_8888;
//設置Window flag參數
wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
//設置x、y初始值
wmParams.x=0;
wmParams.y=0;
//設置窗口長寬數據
wmParams.width=50;
wmParams.height=50;
//創建左右按鈕
createLeftButtonView();
createRightButtonView();
}
/**
* 設置左邊按鈕
*/
private void createLeftButtonView(){
btnLeft=new ImageView(this);
btnLeft.setImageResource(R.drawable.left);
btnLeft.setAlpha(0);
btnLeft.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
//上一個圖像
viewFlipper.setInAnimation(MainActivity.this, R.anim.push_left_in);
viewFlipper.setOutAnimation(MainActivity.this, R.anim.push_left_out);
viewFlipper.showPrevious();
}
});
//調整窗口
wmParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;
//顯示圖像
wm.addView(btnLeft, wmParams);
}
/**
* 設置右邊按鈕
*/
private void createRightButtonView(){
btnRight=new ImageView(this);
btnRight.setImageResource(R.drawable.right);
btnRight.setAlpha(0);
btnRight.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
//下一個圖像
viewFlipper.setInAnimation(MainActivity.this, R.anim.push_right_in);
viewFlipper.setOutAnimation(MainActivity.this, R.anim.push_right_out);
viewFlipper.showNext();
}
});
//調整窗口
wmParams.gravity=Gravity.RIGHT|Gravity.CENTER_VERTICAL;
//顯示圖像
wm.addView(btnRight, wmParams);
}
/**
* 設置按鈕漸顯效果
*/
private Handler mHandler = new Handler()
{
public void handleMessage(Message msg) {
if(msg.what==1 && mAlpha<255){
//通過設置不透明度設置按鈕的漸顯效果
mAlpha += 50;
if(mAlpha>255)
mAlpha=255;
btnLeft.setAlpha(mAlpha);
btnLeft.invalidate();
btnRight.setAlpha(mAlpha);
btnRight.invalidate();
if(!isHide && mAlpha<255)
mHandler.sendEmptyMessageDelayed(1, 100);
}else if(msg.what==0 && mAlpha>0){
mAlpha -= 10;
if(mAlpha<0)
mAlpha=0;
btnLeft.setAlpha(mAlpha);
btnLeft.invalidate();
btnRight.setAlpha(mAlpha);
btnRight.invalidate();
if(isHide && mAlpha>0)
mHandler.sendEmptyMessageDelayed(0, 800);
}
}
};
private void showImageButtonView(){
isHide = false;
mHandler.sendEmptyMessage(1);
}
private void hideImageButtonView(){
new Thread(){
public void run() {
try {
Thread.sleep(1500);
isHide = true;
mHandler.sendEmptyMessage(0);
} catch (Exception e) {
;
}
}
}.start();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_DOWN:
showImageButtonView();
break;
case MotionEvent.ACTION_UP:
hideImageButtonView();
break;
}
return true;
}
@Override
public void onDestroy(){
super.onDestroy();
//在程序退出(Activity銷毀)時銷毀窗口
wm.removeView(btnLeft);
wm.removeView(btnRight);
}
}