導航:首頁 > 操作系統 > viewhelperandroid

viewhelperandroid

發布時間:2023-01-01 10:55:51

Ⅰ 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,我們需要掌握以下幾點:

閱讀全文

與viewhelperandroid相關的資料

熱點內容
有伺服器地址怎麼安裝軟體 瀏覽:659
安卓如何完全清除數據 瀏覽:690
安卓安卓證書怎麼信任 瀏覽:53
伺服器被攻擊如何解決 瀏覽:221
學霸變成程序員 瀏覽:881
c語言編譯錯誤fatalerror 瀏覽:441
ipv4內部伺服器地址怎麼分配 瀏覽:463
java線程安全的方法 瀏覽:950
重復命令畫梯形 瀏覽:164
在疫情就是命令 瀏覽:328
自己搭建一個什麼伺服器好玩 瀏覽:253
java基礎馬士兵 瀏覽:823
完美世界手游如何查看伺服器 瀏覽:859
光遇安卓與ios什麼時候互通 瀏覽:598
js如何運行時編譯 瀏覽:917
引力app在哪裡下載 瀏覽:609
編寫app如何得到錢 瀏覽:801
吉利汽車軟體放哪個文件夾安裝 瀏覽:223
多文件編譯c 瀏覽:543
頭頂加密後為什麼反而更稀疏 瀏覽:794