导航:首页 > 操作系统 > 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相关的资料

热点内容
加密货币容易被盗 浏览:78
苹果平板如何开启隐私单个app 浏览:704
空调压缩机一开就停止 浏览:528
如何下载虎牙app 浏览:847
日语年号的算法 浏览:955
dev里面的编译日志咋调出来 浏览:298
php函数引用返回 浏览:816
文件夹和文件夹的创建 浏览:259
香港加密货币牌照 浏览:838
程序员鼓励自己的代码 浏览:393
计算机网络原理pdf 浏览:752
吃鸡国际体验服为什么服务器繁忙 浏览:94
php中sleep 浏览:490
vr怎么看视频算法 浏览:86
手机app如何申报个人所得税零申报 浏览:694
如何截获手机app连接的ip 浏览:332
冰箱压缩机是否需要电容 浏览:346
python列表每一行数据求和 浏览:276
自己有一台服务器可以玩什么 浏览:657
社会学波普诺pdf 浏览:584