Ⅰ view的滑動和彈性滑動
了解view的滑動必須要先了解以下幾個概念:
view的位置參數:
(1)、left、top、right、bottom分別表示view相對於父控制項的左上頂點的坐標和右下頂點的坐標;分別通過getLeft()、getTop()、getRight()、getBottom()獲得。
(2)、x、y、translationX、translationY。x、y表示view的左上頂點的坐標;translationX、translationY表示view的左上頂點相對於父控制項的偏移量。
(3)、getX()、getY()獲取的是相對於父控制項的坐標;getRawX()、getRawY()獲取的是相對於手機屏幕的坐標。
TouchSlop:常量;和手機設備有關;表示系統所能識別的最小的滑動距離。可以通過ViewConfiguration.get(getContext()).getScaledTouchSlop()獲取;
由於手機屏幕小,所以需要通過滑動來對內容進行顯示和隱藏。view的滑動主要有三種方式:1、通過view的scrollTo/scrollBy方法實現;2、通過動畫給view進行平移操作;3、改變view的Layoutparmes參數,是view進行重新布局,實現滑動。
(1)、scrollTo/scrollBy:mScrollX是view的左邊緣和內容的左邊緣的距離;mScrollY是view的上邊緣和內容的上邊緣的距離。當view的左邊緣在內容的左邊緣的右邊的時候,mScrollX是正值;當view的上邊緣在內容的上邊緣的下邊時,mScrollY為正值;scrollTo和scrollBy方法不會改變view在布局中的位置,改變的是內容的位置。scrollTo()方法讓View相對於初始的位置滾動某段距離,scrollBy()方法則是讓View相對於當前的位置滾動某段距離。同時可以發現scrollBy()是通過scrollTo()方法實現的。
(2)、通過動畫:系統動畫並不能真正改變view的位置參數,如果希望動畫執行完後狀態得以保留,那麼必須將fillAfter屬性設為true;使用屬性動畫就不會有這些問題,但是屬性動畫在android3.0無法使用,必須使用nineoldandroids兼容庫。注意使用兼容庫中的ViewHelper幫助類中的方法。
(3)、通過改變Layoutparmes:view.setLayoutParams();
彈性滑動:1、通過Scroller。2、通過動畫。3、通過延時策略。
首先看一下Scroller的典型用法:
mScroller.startScroll(scrollX, 0, deltaX, 0, 500);只是啟動滑動,但是控制項並不會滑動,真正造成滑動的是下面的invalidate()方法,invalidate()的調用會使得view重繪,調用computeScroll()方法,在computeScroll()方法裡面會判斷滑動是否結束,computeScrollOffset返回值為true表示滑動未結束,返回false表示滑動結束;滑動未結束的時候調用scrollTo()進行滑動,並調用invalidate(),如此循環直到computeScrollOffset返回true為止。
延時策略:通過Handler發送並接收延時消息,每次接收到消息便完成一次ScrollTo操作,從而實現彈性滑動的效果。但是需要注意的是,由於系統的消息調度需要時間,完成這次彈性滑動的時間總是大於if條件判斷為true的次數乘以20ms(延遲消息的發送時間間隔)。因此對彈性滑動完成總時間有精確要求的使用場景下,使用延時策略是一個不太合適的選擇。
public void handleMessage(Message msg) {
switch(mag.what){
case SCROLL_FRACTION:{
//if判斷滑動還沒有結束,結束則不再滑動和發送消息
if(){
//通過滑動完成比例計算該次滑動片段的位置點scrollX,scrollY
View.scrollTo(scrollX,scrollY);
mHandler.sendEmptyMessageDelayed(SCROLL_FRACTION, 20);
}
break;
}
default:
break;
}
}
Ⅱ 怎麼隱藏Android studio 頂部顯示的文件路徑,還有哪個導航欄
在NavigationBar的布局左部加入一個Button(在SystemUI模塊實現),點擊隱藏NavigationBar,即將NavigationBar從WindowManager中移除掉。需要的時候,通過一個從屏幕底部向上的滑動手勢(在policy模塊實現)調出NavigationBar。如下兩圖對比所示:一張為移除前,另一張為移除後。
具體實現:
①.增加按鈕實現動態隱藏,主要修改在frameworks/base/packages/SystemUI模塊,首先我們增加一個按鈕,主要修改
frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml文件,圖片資源和字元串我就不提了,具體如下:
diff --git a/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml b/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml
index 16027d9..326aafc 100644
--- a/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml
+++ b/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml
@@ -42,12 +42,28 @@
>
+
+ <framelayout android:layout_height="match_parent" android:layout_weight="0" android:layout_width="@dimen/navigation_extra_key_width">
+
+
+ </framelayout>
+
+
+ <framelayout android:layout_height="40dp" android:layout_weight="0" android:layout_width="match_parent">
+
+
+ </framelayout>
+
接下來修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java,為按鈕提供一個介面,具體如下:
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 88e71e2..7545984 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -45,6 +45,7 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.DelegateViewHelper;
import com.android.systemui.statusbar.policy.DeadZone;
+import com.android.systemui.statusbar.policy.KeyButtonRipple;
import com.android.systemui.statusbar.policy.KeyButtonView;
import java.io.FileDescriptor;
@@ -265,6 +266,13 @@ public class NavigationBarView extends LinearLayout {
public View getImeSwitchButton() {
return mCurrentView.findViewById(R.id.ime_switcher);
}
+ //BEGIN liweiping
+ public View getHideBarButton() {
+ View view = mCurrentView.findViewById(R.id.hide_bar_btn);
+ view.setBackground(new KeyButtonRipple(getContext(), view));
+ return view;
+ }
+ //END liweiping
private void getIcons(Resources res) {
mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back);
@@ -412,7 +420,6 @@ public class NavigationBarView extends LinearLayout {
mCurrentView = mRotatedViews[Surface.ROTATION_0];
getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener);
-
updateRTLOrder();
}最後便是在frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java實現點擊事件了:
+ private final OnClickListener mHideBarClickListener = new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Log.i(way, mHideBarClickListener onClick...);
+ removeNavigationBar();
+ }
+ };
+ private void removeNavigationBar() {
+ if (DEBUG) Log.d(TAG, removeNavigationBar: about to remove + mNavigationBarView);
+ if (mNavigationBarView == null) return;
+
+ mWindowManager.removeView(mNavigationBarView);
+ mNavigationBarView = null;
+ }到此,隱藏NavigationBar告一段落了。
附上出處鏈接:http://www.2cto.com/kf/201505/399678.html
Ⅲ stata顯示view helper
代表網路故障。出現viewhelper英文標識是系統網路異常導致。
1、首先打開stata。
2、其次點擊網路設置。
3、待網路連接正常後重新打開即可。
Ⅳ 安卓setscalex有沒有改變view的屬性
ViewPagerTransforms
是一個自定義了各種翻轉效果的開源庫,其中的各種PageTransformer使用了view的很多屬性設置方法如DepthPageTransformer中:
package com.ToxicBakery.viewpager.transforms;
import android.view.View;
public class DepthPageTransformer extends ABaseTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
protected void onTransform(View view, float position) {
if (position <= 0f) {
view.setTranslationX(0f);
view.setScaleX(1f);
view.setScaleY(1f);
} else if (position <= 1f) {
final float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setAlpha(1 - position);
view.setPivotY(0.5f * view.getHeight());
view.setTranslationX(view.getWidth() * -position);
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
}
}
@Override
protected boolean isPagingEnabled() {
return true;
}
}
類似於view.setAlpha(1 - position);這樣的一些方法是在api
11屬性動畫出來之後才有的,因此在2.3的手機中無法調用,但是如果我們需要設置一個view的屬性,比如透明度,不調用view.setAlpha的話很難完美的用其他方法實現,有文章說用
convertView.getBackground().setAlpha(80);可以實現改變透明度,但是其實那不是改變view的透明度。
如何解決這個問題呢,改變view的透明度怎麼這么難?
所幸的是nineoldandroids的工具類ViewHelper幫我們解決了這個問題。
nineoldandroids是一個幫助在2.x的版本中實現屬性動畫的開源庫,現在它的應用已經很廣泛了
是一個非常成熟的庫,如果沒有它android中非常實用的屬性動畫很難普及開來。
雖然nineoldandroids是為動畫而生的,但是為了解2.x版本不能使用屬性設置方法的問題nineoldandroids提供了一種通過包裝(wrap)view的方式來兼容setScaleY,setAlpha這些方法,要在2.x版本中使用view.setAlpha()方法,可以這樣做:
1.引入nineoldandroids的庫文件或者jar包,建議引入jar包因為nineoldandroids已經很穩定不需要你去修改。
2.import
com.nineoldandroids.view.ViewHelper同時將上面的代碼改為:
public class DepthPageTransformer extends BaseTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
protected void onTransform(View view, float position) {
if (position <= 0f) {
ViewHelper.setTranslationX(view,0f);
ViewHelper.setScaleX(view,1f);
ViewHelper.setScaleY(view,1f);
} else if (position <= 1f) {
final float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
ViewHelper.setAlpha(view,1-position);
ViewHelper.setPivotY(view,0.5f * view.getHeight());
ViewHelper.setTranslationX(view,view.getWidth() * - position);
ViewHelper.setScaleX(view,scaleFactor);
ViewHelper.setScaleY(view,scaleFactor);
}
}
@Override
protected boolean isPagingEnabled() {
return true;
}
}
Ⅳ android-observablescrollview 怎麼用
主要代碼片段:(後面會有解釋)
import android.content.res.TypedArray;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.nineoldandroids.view.ViewHelper;
public class MainActivity extends ActionBarActivity implements ObservableScrollViewCallbacks{
private static final float MAX_TEXT_SCALE_DELTA = 0.3f;
private static final boolean TOOLBAR_IS_STICKY = true;
private View mToolbar;
private View mImageView;
private View mOverlayView;
private ObservableScrollView mScrollView;
private TextView mTitleView;
private View mFab;
private int mActionBarSize;
private int mFlexibleSpaceShowFabOffset;
private int mFlexibleSpaceImageHeight;
private int mToolbarColor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
mFlexibleSpaceImageHeight = getResources().getDimensionPixelSize(R.dimen.flexible_space_image_height);
mActionBarSize = getActionBarSize();
mToolbarColor = getResources().getColor(R.color.primary);
mToolbar = findViewById(R.id.toolbar);
if (!TOOLBAR_IS_STICKY) {
mToolbar.setBackgroundColor(Color.TRANSPARENT);
}
mImageView = findViewById(R.id.image);
mOverlayView = findViewById(R.id.overlay);
mScrollView = (ObservableScrollView) findViewById(R.id.scroll);
mScrollView.setScrollViewCallbacks(this);
mTitleView = (TextView) findViewById(R.id.title);
mTitleView.setText(getTitle());
setTitle(null);
ScrollUtils.addOnGlobalLayoutListener(mScrollView, new Runnable() {
@Override
public void run() {
mScrollView.scrollTo(0, mFlexibleSpaceImageHeight - mActionBarSize);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
return super.onOptionsItemSelected(item);
}
protected int getActionBarSize() {
TypedValue typedValue = new TypedValue();
int[] textSizeAttr = new int[]{R.attr.actionBarSize};
int indexOfAttrTextSize = 0;
TypedArray a = obtainStyledAttributes(typedValue.data, textSizeAttr);
int actionBarSize = a.getDimensionPixelSize(indexOfAttrTextSize, -1);
a.recycle();
return actionBarSize;
}
@Override
public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {
float flexibleRange = mFlexibleSpaceImageHeight - mActionBarSize;
int minOverlayTransitionY = mActionBarSize - mOverlayView.getHeight();
ViewHelper.setTranslationY(mOverlayView, ScrollUtils.getFloat(-scrollY, minOverlayTransitionY, 0));
ViewHelper.setTranslationY(mImageView, ScrollUtils.getFloat(-scrollY / 2, minOverlayTransitionY, 0));
// Change alpha of overlay
ViewHelper.setAlpha(mOverlayView, ScrollUtils.getFloat((float) scrollY / flexibleRange, 0, 1));
// Scale title text
float scale = 1 + ScrollUtils.getFloat((flexibleRange - scrollY) / flexibleRange, 0, MAX_TEXT_SCALE_DELTA);
ViewHelper.setPivotX(mTitleView, 0);
ViewHelper.setPivotY(mTitleView, 0);
ViewHelper.setScaleX(mTitleView, scale);
ViewHelper.setScaleY(mTitleView, scale);
// Translate title text
int maxTitleTranslationY = (int) (mFlexibleSpaceImageHeight - mTitleView.getHeight() * scale);
int titleTranslationY = maxTitleTranslationY - scrollY;
if (TOOLBAR_IS_STICKY) {
titleTranslationY = Math.max(0, titleTranslationY);
}
ViewHelper.setTranslationY(mTitleView, titleTranslationY);
if (TOOLBAR_IS_STICKY) {
// Change alpha of toolbar background
if (-scrollY + mFlexibleSpaceImageHeight <= mActionBarSize) {
mToolbar.setBackgroundColor(ScrollUtils.getColorWithAlpha(1, mToolbarColor));
} else {
mToolbar.setBackgroundColor(ScrollUtils.getColorWithAlpha(0, mToolbarColor));
}
} else {
// Translate Toolbar
if (scrollY < mFlexibleSpaceImageHeight) {
ViewHelper.setTranslationY(mToolbar, 0);
} else {
ViewHelper.setTranslationY(mToolbar, -scrollY);
}
}
}
@Override
public void onDownMotionEvent() {
}
@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {
}
}
復制代碼
activity_main.xml文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="@dimen/flexible_space_image_height"
android:scaleType="centerCrop"
android:src="@mipmap/ic_pic" />
<View
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="@dimen/flexible_space_image_height"
android:background="?attr/colorPrimary" />
<com.picasso.observablescrollviewdemo.ObservableScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="@dimen/flexible_space_image_height"
android:background="@android:color/transparent" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:text="@string/desc" />
</LinearLayout>
</com.picasso.observablescrollviewdemo.ObservableScrollView>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:popupTheme="@style/Theme.AppCompat.Light.DarkActionBar"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:minHeight="?attr/actionBarSize"
android:textColor="@android:color/white"
android:text="Make Attractive"
android:paddingLeft="@dimen/activity_vertical_margin"
android:textSize="20sp" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/flexible_space_image_height"
android:background="@android:color/transparent" />
</LinearLayout>
</FrameLayout>
復制代碼
其實,效果實現很簡單,控制項ObservableScrollView主要是繼承了ScrollView並實現了Scrollable介面,在MainActivity中,重寫onScrollChanged方法,在方法中,主要做了這幾部操作:
1、隨著滑動,讓圖片mImageView上移
2、隨著滑動,讓蓋在圖片上的view上移,長度是imageView上移的2倍
3、隨著滑動,讓蓋在圖片上的view的alpha值逐漸變大(就是那個漸漸變綠的效果)
4、隨著滑動,讓Title的字體逐漸變小並讓title上移到ToolBar的位置
5、當滑動到ToolBar的位置時,讓ToolBar顯示
Ⅵ Android View知識
1, View是除了Android四大組件外,最常用的東西
2,什麼是View:
View是android中所有控制項的父類,比如TextView,LinearLayout等等
其中LinearLayout繼承自控制項組ViewGroup,當然ViewGroup也是繼承自View
3,View的位置
top:左上角縱坐標
left:左上角橫坐標
right:右下角橫坐標
bottom:右下角縱坐標
如下圖:
4,view的MotionEvent和TouchSlop
4.1MotionEvent:
ACTION_DOWN:手指接觸屏幕
ACTION_MOVE:手指在屏幕上滑動
ACTION_UP:手指離開屏幕。
4.2TouchSlop
處理滑動時的過濾條件,簡單來說就是,手指在屏幕上的一次操作算不算滑動。
系統默認值:ViewConfiguration.get(context).getScaledTouchSlop()
5,getX()getY()和getRawX()和getRawY()
前兩者相對於父控制項View 後兩者相對於手機屏幕
6,VelocityTracker,GestureDetector,Scroller
6.1VelocityTracker:滑動速度,在view的ontouch事件中,查看速度
6.2 GestureDetector:手勢判斷,比如長按,點擊,雙擊等,很少用,可以用 ontouch事件來代替
6.3Scroller:彈性滑動對象,實現view的位置改變等
7,原始滑動方式
7.1:ScrollerTo和Scroller By()
實現簡單 但是只能滑動view裡面的子元素
7.2:改變view參數
實現復雜,但是如果view有交互,這種方式比較好
7.3:動畫
適用於沒有交互的,或者動畫復雜的view的滑動
8View的事件分發:
8.1:Activity-window-View
8.2:view中是從父到子,也就是從外到內,都不處理,返回給最頂級
8.3:ViewGroup默認不攔截任何事件,默認返回false
8.4:分發方法:dispatchTouchEvent,OnInterceptTouchEvent,OnTouchEvent
dispatchTouchEvent:分發
OnInterceptTouchEvent:攔截
OnTouchEvent:處理點擊事件
Ⅶ android viewdraghelper怎麼點擊
要理解ViewDragHelper,我們需要掌握以下幾點:
ViewDragHelper.Callback是連接ViewDragHelper與view之間的橋梁;
ViewDragHelper的實例是通過靜態工廠方法創建的;
ViewDragHelper可以檢測到是否觸及到邊緣;
ViewDragHelper並不是直接作用於要被拖動的View,而是使其控制的視圖容器中的子View可以被拖動,如果要指定某個子view的行為,需要在Callback中實現;
ViewDragHelper的本質其實是分析onInterceptTouchEvent和onTouchEvent的MotionEvent參數,然後根據分析的結果去改變一個容器中被拖動子View的位置。
拖動行為處理
在DragHelperCallback的回調方法中有很多的方法可以檢測View的事件,如常見的clampViewPositionHorizontal、clampViewPositionVertical,並且clampViewPositionHorizontal 和 clampViewPositionVertical必須要重寫,因為默認它返回的是0。
來看clampViewPositionHorizontal的處理。
在DragHelperCallback中實現clampViewPositionHorizontal方法, 並且返回一個適當的數值就能實現橫向拖動效果。
@Override
(Viewchild,intleft,intdx){
Log.d("DragLayout","clampViewPositionHorizontal"+left+","+dx);
finalintleftBound=getPaddingLeft();
finalintrightBound=getWidth()-mDragView.getWidth();
finalintnewLeft=Math.min(Math.max(left,leftBound),rightBound);
returnnewLeft;
}