android 自定义视图中如何在触摸移动时移动视图

android怎么实现 图像随着手指的移动而移动
[问题点数:40分,结帖人tangjuntangjun]
android怎么实现 图像随着手指的移动而移动
[问题点数:40分,结帖人tangjuntangjun]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|Android实现滑动的七种方法实践
在讲解滑动之前,要先熟悉一下安卓的坐标系。安卓视图有两个坐标系,一个是Android坐标系,一个是视图坐标系。前者以屏幕的最左上角为原点,向右为X轴正方向,向下为Y轴正方向。后者以父视图的左上角为原点,其它与前者一致。
而获取坐标的方法也可以分为两类,View提供的获得坐标的方法和MotionEvent提高的方法。View提供的方法有getTop(),getLeft(),getBottom(),getRight(),而MotionEvent提供的方法有getX(),getY(),getRawX(),getRawY()。
如上图所示,getLeft()方法为View自身左边到父布局左边的距离,getTop()方法为View自身的顶边到父布局顶边的距离,getRight()为View自身的右边到父布局左边的距离,getBottom()为View自身底边到父布局顶边的距离。
而getX()为为触摸点到View左边的距离,getY()为触摸点到View顶边的距离。getRawX()为触摸事件到屏幕左边的距离,getRawY()为触摸事件到屏幕顶边的距离。
下面进入正题:
方法一:layout方法
注意:layout方法的参数是(getLeft()+offsetX,getTop()+offsetY.getRight()+offsetX,getBottom()+offsetY),offsetX为水平方向偏移量,offsetY为竖直方向偏移量
关于偏移量的计算可以采用getX()和getRawX()两种方法
首先看使用getX()的方法
&/pre&&p&&/p&&pre name="code" class="java"&import android.content.C
import android.graphics.C
import android.util.AttributeS
import android.view.MotionE
import android.view.V
public class DragView1 extends View {
private int lastX;
private int lastY;
public DragView1(Context context) {
super(context);
ininView();
public DragView1(Context context, AttributeSet attrs) {
super(context, attrs);
ininView();
public DragView1(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
ininView();
private void ininView() {
// 给View设置背景颜色,便于观察
setBackgroundColor(Color.BLUE);
// 视图坐标方式
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录触摸点坐标
case MotionEvent.ACTION_MOVE:
// 计算偏移量
int offsetX = x - lastX;
int offsetY = y - lastY;
// 在当前left、top、right、bottom的基础上加上偏移量
layout(getLeft() + offsetX,
getTop() + offsetY,
getRight() + offsetX,
getBottom() + offsetY);
offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);
如果将上面代码
event.getX();
event.getY();
直接改成getRawX()和getRawY()的话,就会发现图形移动的幅度远大于触摸点移动的幅度(以我的经验,图形很容易就飞出屏幕),而解决这个问题的方法如下。
&/pre&&pre name="code" class="java"&@Override
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) (event.getRawX());
int rawY = (int) (event.getRawY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录触摸点坐标
lastX = rawX;
lastY = rawY;
case MotionEvent.ACTION_MOVE:
// 计算偏移量
int offsetX = rawX - lastX;
int offsetY = rawY - lastY;
// 在当前left、top、right、bottom的基础上加上偏移量
layout(getLeft() + offsetX,
getTop() + offsetY,
getRight() + offsetX,
getBottom() + offsetY);
// 重新设置初始坐标
&strong&lastX = rawX;
lastY = rawY;&/strong&
也就是在重写onTouchEvent 方法时加上加粗的代码,目的是重置初始坐标。不过为什么要这么做呢?
以下是我在调试过程中获得的数据,首先是使用getX()方法时获得的数据(排版有些问题,大家见谅)
08-16 02:01:15.493 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X217Y148offsetX0offsetY2
08-16 02:01:15.551 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y146offsetX4offsetY0
08-16 02:01:15.690 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X220Y149offsetX3offsetY3
08-16 02:01:15.740 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y146offsetX4offsetY0
08-16 02:01:15.778 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y150offsetX4offsetY4
08-16 02:01:15.823 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X226Y153offsetX9offsetY7
08-16 02:01:15.861 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X215Y151offsetX-2offsetY5
08-16 02:01:15.910 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y147offsetX4offsetY1
08-16 02:01:15.924 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X219Y152offsetX2offsetY6
08-16 02:01:15.962 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X218Y149offsetX1offsetY3
08-16 02:01:15.975 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y154offsetX4offsetY8
08-16 02:01:16.041 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X224Y156offsetX7offsetY10
08-16 02:01:16.079 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X217Y155offsetX0offsetY9
08-16 02:01:16.111 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y154offsetX4offsetY8
08-16 02:01:16.124 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X222Y145offsetX5offsetY-1
08-16 02:01:16.177 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X216Y151offsetX-1offsetY5
08-16 02:01:16.242 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X217Y148offsetX0offsetY2
08-16 02:01:16.273 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y152offsetX4offsetY6
08-16 02:01:16.311 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X220Y151offsetX3offsetY5
08-16 02:01:16.346 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X217Y151offsetX0offsetY5
08-16 02:01:16.400 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X217Y150offsetX0offsetY4
08-16 02:01:16.472 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X227Y152offsetX10offsetY6
08-16 02:01:16.507 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X217Y150offsetX0offsetY4
08-16 02:01:16.522 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X218Y157offsetX1offsetY11
08-16 02:01:16.544 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X217Y154offsetX0offsetY8
08-16 02:01:16.578 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y150offsetX4offsetY4
08-16 02:01:16.608 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X222Y145offsetX5offsetY-1
08-16 02:01:16.627 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X216Y151offsetX-1offsetY5
08-16 02:01:16.667 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X217Y150offsetX0offsetY4
08-16 02:01:16.700 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X222Y152offsetX5offsetY6
08-16 02:01:16.750 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X223Y154offsetX6offsetY8
08-16 02:01:16.793 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X221Y154offsetX4offsetY8
08-16 02:01:16.822 /com.example.tai.dragviewtest D/DEBUG: lastX217lastY146X222Y145offsetX5offsetY-1
可以很清楚地看到,由于在触摸点移动时相应的控件也跟着移动,所以效果类似于自动充值,X,Y偏移量都处于一个正常的范围内。
下面看一下getRawX()和getRawY()的情况
08-16 01:28:58.550 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X269Y278
08-16 01:28:58.562 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X284Y307
08-16 01:28:58.611 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X412Y485
08-16 01:28:58.642 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X466Y561
08-16 01:28:58.669 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X495Y595
08-16 01:28:58.777 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X574Y703
08-16 01:28:58.778 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X581Y706
08-16 01:28:58.797 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X603Y747
08-16 01:28:58.828 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X607Y751
08-16 01:28:58.839 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X622Y777
08-16 01:28:58.906 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X626Y78108-16 01:28:58.924 /com.example.tai.dragviewtest D/Debug/t: LastX250LastY237X629Y781
虽然没有打印offsetX和offsetY的值,但可以清楚的看到,由于没有坐标重置,导致offsetX和offsetY的实际值远大于本身的偏移量,因此导致控件唯一幅度远大于触摸点位移的幅度。至于解决方法就是上面所说的。
方法二 offsetLeftAndRight()和offsetTopAndBottom
offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);直接用以上代码来替代layout方法,原理是一样的。
方法三 LayoutParams
我觉得原理是和以上两种一样的,只不过换一下写法,下面是代码。
import android.content.C
import android.graphics.C
import android.util.AttributeS
import android.view.MotionE
import android.view.V
import android.view.ViewG
import android.widget.LinearL
public class DragView3 extends View{
int lastX;
int lastY;
public DragView3(Context context)
super(context);
initView();
public DragView3(Context context,AttributeSet attributeSet)
super(context,attributeSet);
initView();
public DragView3(Context context,AttributeSet attributeSet,int defStyleAttr)
super(context,attributeSet,defStyleAttr);
initView();
private void initView()
setBackgroundColor(Color.BLUE);
public boolean onTouchEvent(MotionEvent event){
int x=(int)event.getX();
int y=(int)event.getY();
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
int offsetX=x-lastX;
int offsetY=y-lastY;
LinearLayout.LayoutParams layoutParams=(LinearLayout.LayoutParams)getLayoutParams();
layoutParams.topMargin=getTop()+offsetY;
layoutParams.leftMargin=getLeft()+offsetX;
setLayoutParams(layoutParams);
}关于LinearLayout.LayoutParams layoutParams=(LinearLayout.LayoutParams)getLayoutParams();你的父布局是什么,这个“LinearLayout”就写什么(前提是有父布局)
此外还可以这么写
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();效果是一样的。
方法四 scrollTo 和scrollBy
这两个方法的区别很明显,一个是To,是到某位置;一个是By,是在原有基础上加上一个偏移量,先说后者。
原理依旧是计算楚偏移量,具体的改变如下。
((View) getParent()).scrollBy(-offsetX, -offsetY);只有这么一点改变,至于为什么是负的,这就涉及视图移动的原理了,简单地说一下。
可以这么想象,所有的视图都画在一张画布上,而上面盖了一块木板,木板上有屏幕那么大的一个空缺,我们看到的实际上是透过木板看到的画布上的景象,你看不到,不代表画布上没画。而scroll两个方法其实都是在移动木板而不是画布,因此方向是相反的(可以自己比划一下)。
然后是scrollTo方法,要注意的是该方法需要用getRawX()和getRawY()获得坐标,另外别忘了重置坐标,否则会出现之前的问题。
((View)getParent()).scrollTo(-x,-y);方法五:Scroller
这个方法和方法四极为相似,不过通过该方法可以让滑动有一个过程(而不是瞬间从一个地方消失再出现另一个地方),这样可以使滑动效果不那么突兀。
使用这个方法的重点在于重写computeScroll()方法(系统在绘制View时会在onDraw()方法中调用此方法)
public class DragView5 extends View {
int lastX;
int lastY;
public DragView5(Context context)
super(context);
initView(context);
public DragView5(Context context, AttributeSet attributeSet)
super(context,attributeSet);
initView(context);
public DragView5(Context context,AttributeSet attributeSet,int defStyleAttr)
super(context,attributeSet,defStyleAttr);
initView(context);
private void initView(Context context)
setBackgroundColor(Color.BLUE);
mscroller=new Scroller(context);
public void computeScroll(){
super.computeScroll();
if(mscroller.computeScrollOffset())
((View)getParent()).scrollTo(mscroller.getCurrX(),mscroller.getCurrY());
invalidate();
public boolean onTouchEvent(MotionEvent event)
int x=(int )event.getX();
int y=(int)event.getY();
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
int offsetX=x-lastX;
int offsetY=y-lastY;
((View)getParent()).scrollBy(-offsetX,-offsetY);
case MotionEvent.ACTION_UP:
View viewGroup=(View)getParent();
mscroller.startScroll(viewGroup.getScrollX(),viewGroup.getScrollY(),-viewGroup.getScrollX(),-viewGroup.getScrollY());
invalidate();
方法六 属性动画
方法七 ViewDragHelper
这个方法我并不熟悉,能看懂,但自己用就很吃力了,也就不多说了,上代码(这个的代码实现了类似于QQ侧边栏效果)
import android.content.C
import android.support.v4.view.ViewC
import android.support.v4.widget.ViewDragH
import android.util.AttributeS
import android.view.MotionE
import android.view.V
import android.widget.FrameL
public class DragViewGroup extends FrameLayout {
private ViewDragHelper mViewDragH
private View mMenuView, mMainV
private int mW
public DragViewGroup(Context context) {
super(context);
initView();
public DragViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
public DragViewGroup(Context context,
AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
protected void onFinishInflate() {
super.onFinishInflate();
mMenuView = getChildAt(0);
mMainView = getChildAt(1);
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = mMenuView.getMeasuredWidth();
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mViewDragHelper.shouldInterceptTouchEvent(ev);
public boolean onTouchEvent(MotionEvent event) {
//将触摸事件传递给ViewDragHelper,此操作必不可少
mViewDragHelper.processTouchEvent(event);
private void initView() {
mViewDragHelper = ViewDragHelper.create(this, callback);
private ViewDragHelper.Callback callback =
new ViewDragHelper.Callback() {
// 何时开始检测触摸事件
public boolean tryCaptureView(View child, int pointerId) {
//如果当前触摸的child是mMainView时开始检测
return mMainView ==
// 触摸到View后回调
public void onViewCaptured(View capturedChild,
int activePointerId) {
super.onViewCaptured(capturedChild, activePointerId);
// 当拖拽状态改变,比如idle,dragging
public void onViewDragStateChanged(int state) {
super.onViewDragStateChanged(state);
// 当位置改变的时候调用,常用与滑动时更改scale等
public void onViewPositionChanged(View changedView,
int left, int top, int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);
// 处理垂直滑动
public int clampViewPositionVertical(View child, int top, int dy) {
// 处理水平滑动
public int clampViewPositionHorizontal(View child, int left, int dx) {
// 拖动结束后调用
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
//手指抬起后缓慢移动到指定位置
if (mMainView.getLeft() & 500) {
//关闭菜单
//相当于Scroller的startScroll方法
mViewDragHelper.smoothSlideViewTo(mMainView, 0, 0);
ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);
//打开菜单
mViewDragHelper.smoothSlideViewTo(mMainView, 300, 0);
ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);
public void computeScroll() {
if (mViewDragHelper.continueSettling(true)) {
ViewCompat.postInvalidateOnAnimation(this);
这是我第一次写博客,这篇博客是我在学习《Android群英录》的时候写的总结,本来算是一个私人的笔记,但我觉得可能对同时初学者的其他人有用,所以最后还是发了出来。
这些代码基本上都是我从《Android群英录》个github上弄下来的,自己看明白后把原来的注释掉自己写一遍,然后碰到了一些问题和解决办法记了下来。
这篇博客除了代码都是纯手打,我个人觉得勉强算是原创,如果我弄错了,请联系我,我会及时删除。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!android中一些view处理(拖动,定位,显示,图层)
在看到现行手机能够趋近拥有与pc机相同性能的同时,我们不难发现各种应用、软件都移植到了手机上,略从android,iphone,ophone等智能手机系统,我们便能一叶知秋了。
每天学习着android,会发现这样一个感受,android中很多东西对于一个喜欢口若悬河的家伙必然显得非常容易。慢慢解决问题的过程中才发 现,android需要我们自己去摸,去体会,即使市面上不乏很多优秀的书籍,但各有千秋,又各有瑕疵与短见。或者说,有些书适合入门,有些适合进阶,有 些适合探究等等。闲话休提,且入正题。
除了android中“四大件”(我喜欢这样称呼他们,activity,service,broadcast、data-provider),还有我们 必不可少的,用户体验离不开的,手机要吸引人不能不考虑的就是View,View家族很强大,其子类很丰富,从TextView到Button。了解了 android手机设计对于MVC模式之重视程度是必不容忽视的,不仅使我们在设计体验了方便,也让我们直观看到各种布局样式,很易理解android中
各种容器,组件的层次。
前面做过一个例子:想做一个对图片进行拖动的程序,便考虑到用自己写一个View子类。这个过程让我主动去了解onDraw(),以及其被调用的时间和境 况,因为图片移动过程中是View进行更新的结果!完成之后,发现onDraw中的drawBitmap()给我出来一道难题:图片越大,拖动效果越差, 近乎剩下突变!后来找到网上找到一个拖动Button的例子,效果很好,于是想到用ImageButton代替之,果然效果很好,便以为
ImageButton乃“神物”也,便亲之有加。后冷静思索,比较代码,发现是由于在ImageButton中直接将图片设为background才导 致拖动栩栩如生!应用至MyView,也一样了,但个中原因还需再花功夫才能与大家分享。
想接着上面的MyView谈,发现我用上了一个倒叙的说法。随机定位,这个功能是在拖动之前实验的。反反复复的找了View的setX()函数,很失 望,android没有(有getWidth()等函数)。不卖关子了:你用layout(a,b,c,d)函数效果极佳!注意:牢牢监视a,b参数,便 能在图片定位方面为所欲为了。
显示方面,我想说的是别忽视Layout这个类的布局功能,简单了解之,便能很容易掌握。习惯了ps,flash,j2me中的图层的叫法,可能很难找到android它能帮助你想要完成的功能,记住FrameLayout,用它便能玩玩图层什么的。
很惊异的发现:
android.widget.AbsoluteLayout
android.text.Layout
我相信是合理的存在,所以还有很多,我们期待共同发现,探究!
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!和太阳肩并肩
浮动视图效果
第三种实现方式
一、有图有真相
二、如何实现浮动视图?
1. 使用WindowManager达到浮动视图效果。
2. Android UI是树级结构,可以是同级视图一个在上面一个在下面,例如: 中的布局方式。也可以是上级视图。
3. 当前实现方式,画出一个视图达到浮动效果。之前虽然也学习过Canvas知道可以绘制出图形,但是这种浮动视图实现效果还是很震惊。
使用View的属性把想要达到浮动效果的视图转换成Bitmap,具体可以看下。
创建ImageView并设置Bitmap。
重新对创建的ImageView 进行Measure,Layout操作,之后在dispatchDraw中把想要浮动的视图绘制出来。
当前例子是使用ListView演示效果,ListView本身是ViewGroup子类,只要是ViewGroup子类都可以通过这种方式实现浮动视图效果。
三、伪代码
自定义ListView,先来看看触发显示浮动视图的地方。如果创建ListView这里就不再解释了。
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 按下的时候显示浮动视图
showFloatView(event);
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// 抬起时清除浮动视图
destroyFloatView();
return super.onTouchEvent(event);
以上在DOWN事件是显示浮动视图,UP事件时隐藏浮动视图,现在来看看如何实现显示浮动视图的
* 显示浮动视图
* @param event
private void showFloatView(MotionEvent event) {
// 通过坐标获取指定选中的Item的位置
mSelectedPosition = pointToPosition((int)event.getX(), (int)event.getY());
if (mSelectedPosition == MISS) {
// 当前触摸的Item视图
View clickItem = getChildAt(mSelectedPosition);
if (clickItem == null) {
// 转换为图片
clickItem.setDrawingCacheEnabled(true);
mSelectedItemBitmap = Bitmap.createBitmap( clickItem.getDrawingCache() );
clickItem.setDrawingCacheEnabled(false);
// 创建浮动视图
if (mFloatView == null) {
mFloatView = new ImageView(getContext());
mFloatView.setPadding(0, 0, 0, 0);
mFloatView.setImageBitmap(mSelectedItemBitmap);
mFloatView.setLayoutParams(new LayoutParams(clickItem.getWidth(), clickItem.getHeight()));
measureFloatView();
// 隐藏当前Item
clickItem.setVisibility(View.INVISIBLE);
// 使以上设置生效
requestLayout();
3. 销毁浮动视图
* 注销浮动视图
private void destroyFloatView() {
if (mFloatView != null) {
mFloatView.setVisibility(View.GONE);
// 销毁Bitmap,不注意回收容易出现内存溢出
if (mSelectedItemBitmap != null) {
mSelectedItemBitmap.recycle();
mSelectedItemBitmap =
mFloatView =
// 显示之前隐藏的选中Item
if (mSelectedPosition != MISS) {
View selectedItem = getChildAt(mSelectedPosition);
if (selectedItem != null) {
selectedItem.setVisibility(View.VISIBLE);
mSelectedPosition = MISS;
invalidate();
四、源码下载
转载请注明出处:
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!当前位置: >
Android让视图移动/缩放/透明度更改与其父滚动。
时间: 08:19 来源:互联网 作者:源码搜藏 浏览:
源码类别:视图效果View Effects
源码大小:未知
编码格式:gbk
授权方式:免费源码
运行环境:Android studio
官方网址:暂无
欢迎加入QQ群讨论学习
SelfAdjointView是一个Android库,允许开发人员轻松地让视图随着可以滚动的父代更改。动画包含视差,alpha,scale的一个或多个。
滚动型/ Horizo​​ntalScrollView
的ListView / GridView控件
RecyclerView
可以滚动的其他
&.............
..............
如何使用它?
dependencies {
// jCenter
compile 'com.cysion:adjointlib:1.0.0'
现在效果只能用于图像,而图像可以放置在任何视图组中,只要它是AdjointImageView,它由AdjointContainer包装。请注意,在这种情况下,AdjointContainer应该只有一个孩子,图像的高度/宽度应该大于容器(垂直移动)。
布局中的代码
...&sth like scrollview&...
&LinearLayout xmlns:android=&http://schemas.android.com/apk/res/android&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:background=&#66ffffff&
android:orientation=&horizontal&
android:padding=&10dp&&
&com.cysion.adjointlib.view.AdjointContainer
android:id=&@+id/container&
android:layout_width=&180dp&
android:layout_height=&100dp&
android:layout_gravity=&center_horizontal&
android:layout_margin=&10dp&
&com.cysion.adjointlib.view.AdjointImageView
android:id=&@+id/img_holder_img&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:adjustViewBounds=&true&
android:background=&#99ff0000&
android:padding=&3dp&
&/com.cysion.adjointlib.view.AdjointContainer&
...other view...
&/LinearLayout&
...&/sth like scrollview&...
在Rect中设置滚动视图的位置,并为AdjointContainer提供定位器。
SecondActivity
扩展 AppCompatActivity
implements
Locator ...
mContainer1 =(AdjointContainer)findViewById(R .id.adcontainer1);
mScrollView。post(new
Runnable(){
void run(){
mScrollView 。getGlobalVisibleRect(MR);
mContainer1 。setlocator命令(SecondActivity 。此);
Rect getLocation(){
return mR;
创建一个AdjointStyle对象,并将其添加到容器中。
AdjointStyle style =
VerticalMoveStyle()。minScale(0.9f);
mContainer1 。addStyle(风格);
现在当父滚动时,图像也会滚动。
阿尔法/缩放
显示这些效果的视图应该包装在AdjointContainer中。
布局中的代码
&ScrollView
xmlns:android=&http://schemas.android.com/apk/res/android&
android:id=&@+id/scroller&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
&LinearLayout
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical&&
&com.cysion.adjointlib.view.AdjointContainer
android:id=&@+id/adcontainer1&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_marginBottom=&10dp&&
&com.cysion.adjointlib.view.AdjointImageView
android:id=&@+id/img_ad1&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:adjustViewBounds=&true&
android:src=&@mipmap/p1c&/&
android:layout_width=&wrap_content&
android:layout_height=&40dp&
android:layout_alignParentBottom=&true&
android:layout_below=&@+id/img_ad1&
android:layout_centerHorizontal=&true&
android:text=&Hello world&
android:textColor=&@color/colorPrimary&
android:textSize=&24sp&/&
&/com.cysion.adjointlib.view.AdjointContainer&
....../other view.....
....../other view.....
....../other view.....
....../other view.....
&/LinearLayout&
&/ScrollView&
就像Parallex-step2中的step2一样。
创建一个或多个AdjointStyle对象,并将其添加到容器中。
AdjointStyle style =
VerticalMoveStyle()。minScale(0.9f);
AdjointStyle style2 =
VerticalAlphaStyle();
mContainer1 。addStyle(风格);
mContainer1 。addStyle(蓝紫魅力);
现在当父滚动时,图像将改变其alpha或scale。
转载请注明出处
源码搜藏网所有源码来自用户上传分享,版权问题及牵扯到商业纠纷均与源码搜藏网无关

我要回帖

更多关于 android 自定义视图 的文章

 

随机推荐