`
liguanyi11111
  • 浏览: 62513 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
社区版块
存档分类
最新评论

Android动画被父View遮挡的解决办法。

 
阅读更多

    Android的Animation动画想必大家非常熟悉,也相对是比较好用的动画方式。但是这个动画有个很大的缺点,这个动画无法再使用动画的View的父组件之外使用。这个是Animation的实现方式导致的,由于View是由其父组件绘制,而Animation也不过是不断改变位置然后在不断刷新而已,所以仍然没有摆脱是由其父View进行绘制的根本,所以无论如何View是不能超出其父View的边界显示的。这条路行不通。

    这里我们就要从根本出发,我们为什么要让动画超出父组件,如果父组件是和屏幕一样大ViewGroup,我们还需要超出去么?当然不需要了。所以,我们需要使用动画的一般都是个小ViewGroup中的一个View。这里我们就要转化一下思路,无论这个View在哪里,上边有几层父view,我们不去管它。我们只需要建立一个副本(或者取出这个View)放在最大的ViewGroup(足够执行动画的ViewGroup,使用全屏的最方便)中。这样我们就完全不用担心遮挡的问题了。但是新的问题产生了,View的内容很容易复制,但是他的位置如何设置呢。显然,我们的目标就是让这两个View重合,但是由于它们不在一个ViewGroup中,所以不能单纯的设置相同的相对位置。在这里,介绍一个简单的方法。



 如图所示,假设红色为手机屏幕。黄色为我们的目标View。而他的父ViewGroup蓝色框的大小不足以让他显示动画。我们需要将目标放入黑色边框的ViewGroup中才行,这时我们只需要首先使用VIew.getLocationOnScreen()方法获取到黄色框相对于屏幕的位置。然后在获取黑色边框相对屏幕的位置。这时我们将黄色View从蓝色框中取出(复制一个黄色View副本也可以),放入黑色框中,这里他相对父组件(黑色边框)的位置就是刚刚获取的黄色相对屏幕位置—黑色相对屏幕位置。这时,我们遮挡的问题就都解决了。语文功底不好,描述有点混乱,但应该很容易理解。

     这里要注意一点,如果在Activity启动时就要展示这种动画,或者通过这种方式想长时间放一个View副本在这个位置上用于显示动画。那么不要在onCreate中获取目标View的位置,这是获取不到的(此时还没有进行layout,View还没有绘制)。我们可以再onCreate中创建相关对象,如View,LayoutParams等。但是位置的获取要放在onWindowFocusChanged()中,否则获取的都是0,没有意义。

下面提供一些简单代码:

public class MainActivity extends Activity implements OnClickListener{
	private View mTargetView;        //目标View
	private View mCopyView;          //复制的View
	private ViewGroup mParentView;     //父View
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		.........        //一些View的获取与设置  省略
		mCopyView = new View(this);      //新建副本View
		mCopyView.setBackgroundColor(Color.RED);  
		RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(0, 0);	 //建立layout属性对象	
		mParentView.addView(mCopyView , params);    //加入父View中
	}
	
	@Override
	public void onWindowFocusChanged(boolean hasFocus) {
		super.onWindowFocusChanged(hasFocus);
		if(hasFocus){
			int[] location = new int[2];
			int[] location_L = new int[2];
			mTargetView.getLocationOnScreen(location);  //获取目标View的相对屏幕位置
			mParentView.getLocationOnScreen(location_L);     //获取父View相对屏幕位置                        
			RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)mCopyView.getLayoutParams();
			params.leftMargin = location[0] - location_L[0];   
			params.topMargin = location[1] - location_L[1];   //给副本View设置位置,与目标View重合
                         .......    //这里还需要设置大小等属性,省略
		}
	}

	@Override
	public void onClick(View v) {	
		mCopyView.startAnimation("动画");
	}	
}

  

  • 大小: 1.5 KB
分享到:
评论
1 楼 jason_zmq 2015-06-16  
多谢博主,呵呵,正好碰到个这样的问题,提醒了我,给了我思路,多谢多谢!

相关推荐

    android 动画被父布局遮盖问题解决1

    总之,解决Android动画被父布局遮盖的问题,关键在于理解和正确应用`android:clipChildren`和`android:clipToPadding`属性,以及在必要时使用`bringToFront()`方法。通过这些技术,我们可以创建出更加流畅、无遮挡的...

    android控件放大被遮盖已解决

    Android提供了`bringToFront()`方法,可以将指定的视图移到其父视图的最前面,从而确保它不再被前面的视图遮挡。例如,在你的代码中,你可以这样调用: ```java myView.bringToFront(); ``` 这行代码会让`myView`...

    Android SurfaceView添加组件view不被组件覆盖.rar

    5. **利用ViewOverlay**:Android API 19及更高版本提供了ViewOverlay功能,可以在任何View之上添加额外的Drawable对象,这可以用来在SurfaceView上添加不被覆盖的组件。 6. **使用SurfaceView的透明区域**:通过...

    Android RecyclerView item选中放大被遮挡问题详解

    然而,当使用RecyclerView时,可能会遇到一个常见的问题:当itemView执行放大动画后,由于RecyclerView的绘制顺序机制,可能会被其他item View遮挡。这个问题主要由以下原因导致: 1. RecyclerView的绘制机制是按照...

    android 3d翻转View

    首先,3D翻转是通过Android的动画框架实现的,特别是`android.view.animation`包中的`ObjectAnimator`和`PropertyValuesHolder`类。`ObjectAnimator`可以用来对对象的属性进行动画控制,而`PropertyValuesHolder`则...

    Android-Android开发使用PupopWindow在指定View的上下左右动态显示菜单列表

    在Android开发中,PopupWindow是一种常用的轻量级组件,它可以在屏幕任意位置弹出一个窗口,通常用于实现快捷菜单、下拉列表等效果。在本示例中,我们将探讨如何利用PopupWindow模仿iOS中的底部弹窗列表,为用户提供...

    android跟随手指移动的view

    - 为了防止View在移动过程中遮挡其他View,确保其父布局允许子View有适当的层叠顺序。 - 考虑到性能,避免在ACTION_MOVE事件中执行过于复杂的操作,以保持良好的用户体验。 10. 应用场景: 这种技术广泛应用于...

    安卓键盘输入相关-android解决软键盘遮挡输入框的示例代码.zip

    4. **使用第三方库**:有一些开源库如`androidx.coordinatorlayout.app.KeyboardUtil`和`androidx.core.view.WindowInsetsCompat`可以帮助开发者更方便地处理键盘遮挡问题。 5. **监听键盘状态**:可以使用`...

    Android SurfaceView添加组件view不被组件覆盖.zip源码资源下载

    本资源"Android SurfaceView添加组件view不被组件覆盖.zip"可能是解决了一个在SurfaceView上添加其他View时,如何防止这些View遮挡SurfaceView的问题。 在Android中,通常我们会遇到一个问题:当在一个布局中同时...

    androidlayout-marginBottom的值为负数.docx

    在Android布局设计中,`android:layout_margin`属性用于设置View与周围元素的边距,包括`android:layout_marginTop`、`android:layout_marginBottom`、`android:layout_marginLeft`和`android:layout_marginRight`。...

    android下载-等待提示动画.rar

    "android下载-等待提示动画.rar"这个资源包包含了用于Android应用程序的等待提示动画,它旨在为用户展示一个过渡动画,使他们在程序加载或执行后台任务时不会感到枯燥乏味。 这个压缩包中的核心文件名为...

    android源码 等待提示动画

    在Android开发中,等待提示动画(等待动画)是提升用户体验的重要元素之一。它可以在应用程序执行耗时操作,如加载数据或处理任务时显示,让用户知道系统正在进行工作,并提供视觉反馈,减少用户对延迟的感知。...

    Android 等待提示动画源码.rar

    在Android开发中,等待提示动画通常用于在应用执行耗时操作时给用户一个可视化的反馈,比如网络请求、数据加载等。本资源“Android 等待提示动画...对于深入理解Android动画系统和提高开发技能,这是一个宝贵的资源。

    解决SurfaceView设置透明造成覆盖其他组件的替代方案

    总结来说,解决SurfaceView透明覆盖问题的关键在于使用TextureView,并正确管理绘制和动画。通过这种方式,我们不仅可以实现透明效果,还能方便地实现圆盘或其他复杂的视图功能。在实际项目中,可以根据具体需求进行...

    Android-快手Android客户端纯代码实现的快门打开下拉刷新动画

    在`onDraw()`方法中,我们将绘制快门的初始状态,通常是一部分被遮挡的状态。随着下拉的距离增加,快门将逐渐打开。我们可以使用`MotionEvent`来捕获用户的滑动事件,获取滑动距离,并根据这个距离动态调整快门的...

    Android 翻书效果

    而Android的动画框架则更为简单,适用于基础的平移、旋转和缩放等动画效果。 在实现翻书效果时,我们需要创建书页的模型,这包括前后两页以及它们之间的转折部分。这些模型通常以纹理图像的形式存在,每个页面的...

    Android-PopoverView-一个模仿iOSUIPopoverController效果的控件

    对于Android开发中的提示框(Tip),PopoverView提供了一种新的解决方案,尤其适用于需要显示大量信息或多个操作选项的情况,避免了传统的对话框可能会遮挡屏幕内容的问题。开发者可以根据项目需求,结合使用Popover...

    Android-ForegroundViews-类似于FrameLayout的支持的前景自定义View

    4. **安全区域适配**:在刘海屏或其他有物理切口的设备上,前景视图可以帮助开发者处理安全区域的问题,确保内容不被遮挡。 使用`ForegroundViews`时,你需要创建一个自定义视图,并设置为布局的前景。在代码中,...

Global site tag (gtag.js) - Google Analytics