如何去掉surfacimageview 重叠黑色重叠部分

图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系1、SurfaceSurfaceextends Objectimplements Parcelable.lang.Object&&&?.view.SurfaceClass OverviewHandle>简单翻译:Surface是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像合成器(screen compositor)管理的。1.1、 就如在一样,通过一个文件的句柄,就可以操作文件,获取文件的内容。 同样的,通过Surface就可以获取raw buffer其中的内容。原生缓冲区(raw buffer)着当前窗口的像素数据。1.2、事实上,当得到一个Surface对象时,同时会得到一个Canvas(画布)对象。这一点可以通过查看\frameworks\base\core\java\android\view\Surface.java文件可知道Surface类定义了一个Canvas成员变量
//@\frameworks\base\core\java\android\view\Surface.java
// The mSurfaceControl will>1.3、 理解Canvas对象,可以把它当做画布,Canvas的方法大多数是设置画布的大小、形状、画布背景颜色等等,要想在画布上面画画,一般要与Paint对象结合使用,顾名思义,Paint就是画笔的风格,颜料的色彩之类的。
// 创建画笔
Paint paint = new Paint();
paint.setColor(Color.RED);// 设置红色
canvas.drawCircle(60, 20, 10, paint);// 画一个圆
1.4、Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原生缓冲器以及其它方面的内容。1.5、Surface实现了Parcelable,(implements Parcelable),也就是说Surface对象可以把显示内容的数据写入到 Parcel 中,并且能够从Parcel读回数据。Parcelableandroid.os.ParcelableKnown Indirect SubclassesAbsSavedState,AbsoluteSizeSpan,AccessibilityEvent,AccessibilityNodeInfo,AccessibilityServiceInfo,Account,AccountAuthenticatorResponse,ActivityInfo,ActivityManager.MemoryInfo,ActivityManager.ProcessErrorStateInfo,ActivityManager.RecentTaskInfo,ActivityManager.RunningAppProcessInfo,ActivityManager.RunningServiceInfo, ActivityManager.RunningTaskInfo, and 144 others. Class Overview
classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field calledCREATOR, which is an object implementing theParcelable.Creator interface.简单翻译:&&&&&& 实现这个接口的对象可以写入数据到Parcel,同时也可以把数据读出来。2、SurfaceViewSurfaceViewextends Viewjava.lang.Object&&&?android.view.View&&&&?android.view.SurfaceViewKnown Direct SubclassesGLSurfaceView,RSSurfaceView,VideoViewClass OverviewProvides a dedicated drawing surface embedded inside of a view hierarchy. You can control the format of this surface and, if you like, the SurfaceView takes care of placing the surface at the correct location>简单翻译:&&&&&&&& SurfaceView提供了一个专门用于绘制的surface,这个surface内嵌于。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface在屏幕的正确绘制位置。&&&&&&& surface是Z-ordered的(也就是说在xyz坐标系中,按照Z坐标排序的,Z值大的表面覆盖在Z值小的表面的上方),这表明它总在自己所在窗口的后面。surfaceview在显示窗口处为Surface提供了一个可见区域,通过这个区域,才能看到Surface里面的内容。可以放置一些覆盖图层(overlays)在Surface上面,如Button、Textview之类的。但是,需要注意的是,如果Surface上面有全透明的控件,那么随着Surface的每一次变化,这些全透明的控件就会重新渲染,这样的话,就影响性能与显示的效果。&&&&&&& 你可以通过SurfaceHolder这个接口去访问Surface,而执行getHolder()方法可以得到SurfaceHolder接口。&&&&&&& 当SurfaceView的窗口可见时,Surface就会被创建,当SurfaceView窗口隐藏时,Surface就会被销毁。当然了,你也可以通过复写surfaceCreated(SurfaceHolder) 和 surfaceDestroyed(SurfaceHolder)& 这两个方法来验证一下Surface何时被创建与何时被销毁。&&&&&&& SurfaceView提供了一个运行在渲染线程的surface,若你要更新屏幕,你需要了解以下线程。所有SurfaceView 和 SurfaceHolder.Callback的方法都应该在主线程(UI线程)里面调用,应该要确保渲染进程所访问变量的同步性。你必须确保只有当Surface有效的时候,(也就是当Surface的生命周期在SurfaceHolder.Callback.surfaceCreated() 和SurfaceHolder.Callback.surfaceDestroyed()之间)才能让渲染进程访问。2.1、SurfaceView与Surface的联系简单来说,SurfaceView与Surface的联系就是,Surface是管理显示内容的数据(implementsParcelable),包括存储于数据的交换。而SurfaceView就是把这些数据显示出来到屏幕上面。两者联系如图所示:3、SurfaceHolderSurfaceHolderandroid.view.SurfaceHolderClass OverviewAbstract interface to someone holding a display surface. Allows you to control the surface size and format, edit the pixels in the surface, and monitor changes to the surface. This interface is typically available through theSurfaceView class.When using this interface from a thread other than the>简单翻译:&&&&&&& SurfaceHolder是控制surface的一个抽象接口,你可以通过SurfaceHolder来控制surface的尺寸和格式,或者修改surface的像素,监视surface的变化等等,SurfaceHolder是SurfaceView的典型接口。&&&&&&& 与直接控制SurfaceView来修改surface不同,使用SurfaceHolder来修改surface时,需要注意lockCanvas() 和Callback.surfaceCreated().这两个方法。SurfaceHolder控制surface的流程所使用的几个方法。3.1、abstract void&& &addCallback(SurfaceHolder.Callback callback)&&&&&&&&&&&& Add a Callback interface for this holder.// 给SurfaceHolder一个回调对象。3.2、abstract Canvas&& &lockCanvas(Rect dirty)&&&&&&&&&&&& Just like lockCanvas() but allows specification of a dirty rectangle.&&&&&&&&&&&& // 锁定画布中的某一个区域,返回的画布对象Canvas(当更新的内容只有一个区域时,同时要追求高效,可以只更&&&&&&&&&& & 新一部分的区域,而不必更新全部画布区域)3.3、abstract Canvas&& &lockCanvas()&&&&&&&&&&&& Start editing the pixels in the surface.// 锁定画布,返回的画布对象Canvas3.4、abstract void&& &removeCallback(SurfaceHolder.Callback callback)&&&&&&&&&&&& Removes a previously added Callback interface from this holder.//移除回调对象3.5、abstract void&& &unlockCanvasAndPost(Canvas canvas)&&&&&&&&&&&& Finish editing pixels in the surface.// 结束锁定画图,并提交改变。4、SurfaceHolder.CallbackSurfaceHolder.Callbackandroid.view.SurfaceHolder.CallbackKnown Indirect SubclassesGLSurfaceView,NativeActivity,RSSurfaceView,SurfaceHolder.Callback2Class OverviewA client may implement this interface to receive information about changes to the surface. When used with aSurfaceView, the Surface being held is>简单翻译:SurfaceHolder.Callback是监听surface改变的一个接口4.1、public abstract voidsurfaceChanged(SurfaceHolder holder, int format, int width, int height)holderThe SurfaceHolder whose surface has changed.formatThe new PixelFormat of the surface.widthThe new width of the surface.heightThe new height of the surfa//surface发生改变时被调用4.2、public abstract voidsurfaceCreated(SurfaceHolder holder)holderThe SurfaceHolder whose surface is being created//在surface创建时被调用,一般在这个方法里面开启渲染屏幕的线程。4.3、public abstract voidsurfaceDestroyed(SurfaceHolder holder)holderThe SurfaceHolder whose surface is being destroyed.& //销毁时被调用,一般在这个方法里将渲染的线程停止。&附上上述所说几种的联系方法SurfaceHolder = SurfaceView.getHolder();Surface = SurfaceHolder.getSurface();Canvas =SurfaceHolder.LockCanvas(Rect dirty)Canvas
=Surface.lockCanvas(Rect dirty)5、Demo小共有两个class如下,具体看和注释。进入程序,执行public void surfaceCreated(SurfaceHolder holder)然后执行public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)退出程序调用surfaceDestroyed,释放资源。public void surfaceDestroyed(SurfaceHolder holder)/****************************************************************/效果图:@MySurfaceView.java/* * author: conowen * e-mail:
*/package com.conowen.SurfaceViewDimport android.app.Aimport android.os.Bpublic class SurfaceViewDemoActivity extends Activity {
/** Called when the activity is first created. */
public void>@SurfaceViewDemoActivity.java/* * author: conowen * e-mail:
*/ com.conowen.SurfaceViewDimport android.content.Cimport android.graphics.Cimport android.graphics.Cimport android.graphics.Pimport android.graphics.Rimport android.util.Limport android.view.SurfaceHimport android.view.SurfaceVpublic class MySurfaceView extends SurfaceView implements
SurfaceHolder.Callback { private String TAG = &conowen&;
private SurfaceH private boolean ThreadF
private C private Thread mThread = new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
while (ThreadFlag) {
// 锁定画布,得到Canvas对象
canvas = sfh.lockCanvas();
// 设定Canvas对象的背景颜色
canvas.drawColor(Color.GREEN);
// 创建画笔
Paint p = new Paint();
// 设置画笔颜色
p.setColor(Color.RED);
// 设置文字大小
p.setTextSize(40);
// 创建一个Rect对象rect
// public Rect (int left, int top, int right, int bottom)
Rect rect = new Rect(100, 50, 400, 350);
// 在canvas上绘制rect
canvas.drawRect(rect, p);
// 在canvas上显示时间
// public void drawText (String text, float x, float y, Paint
canvas.drawText(&时间 = & + (counter++) + & 秒&, 500, 200, p);
if (canvas != null) {
// 解除锁定,并提交修改内容,更新屏幕
sfh.unlockCanvasAndPost(canvas);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }); public MySurfaceView(Context context) {
super(context);
// TODO Auto-generated constructor stub
// 通过SurfaceView获得SurfaceHolder对象
sfh = this.getHolder();
// 为SurfaceHolder添加回调结构SurfaceHolder.Callback
sfh.addCallback(this); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
Log.i(TAG, &surfaceChanged&); } @Override public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
Log.i(TAG, &surfaceCreated&);
counter = 0;
ThreadFlag =
mThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
Log.i(TAG, &surfaceDestroyed&);
ThreadFlag = }}RT急急急!!!android从view切换surfaceview的时候,出现短暂的黑屏,怎么处理才可以不出现黑屏?
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
德问是一个专业的编程问答社区,请
后再提交答案
没有相关问题
关注该问题的人
共被浏览 (3069) 次& SurfaceView
&&&&&&&由此可见View类属于Android开发绘制中的显示老大,任何与绘制有关系的控件都是它的子类。在这篇文章中我主要讲View 与SurFaceView 使用线程刷新屏幕绘制方面的知识。开发中如何去选择使用View还是SurFaceView。我相信读过我前几篇博客的朋友应该知道我在刷新屏幕的时候使用invalidate()方法来重绘,下面我详细的说明一下Andooid刷新屏幕的几种方法。
发布:鸡啄米
&&&&&&&上次简单地介绍了AudioRecord和AudioTrack的使用,这次就结合SurfaceView实现一个Android版的手机模拟信号示波器。最近物联网炒得很火,作为手机软件开发者,如何在不修改手机硬件电路的前提下实现与第三方传感器结合呢?麦克风就是一个很好的ADC接口,通过麦克风与第三方传感器结合,再在软件里对模拟信号做相应的处理,就可以提供更丰富的传感化应用。
发布:鸡啄米
&&&&&&&上节中简单介绍了SurfaceView的基本使用方法,本节主要讲解SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用。android的多线程用法与JAVA的多线程用法完全一样,本文不做多线程方面的介绍了。直接讲解SurfaceView与多线程的混合使用,即开一条线程专门读取图片,另外一条线程专门绘图。
发布:鸡啄米
&&&&&&&上次介绍MediaPlayer的时候稍微介绍了SurfaceView,SurfaceView由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,这次我就用两篇文章来介绍SurfaceView的用法。网上介绍SurfaceView的用法有很多,写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等
发布:鸡啄米
&&&&&&&做游戏引擎总是倾向于使用OpenGL,这是为什么呢?本文就简单跟大家分析说明下。 如今国外游戏基本上质量都很好,不管是从视觉上、操作上还是流畅度上,那么今天我们关注的是流畅度。 首先有经验的游戏开发者,尤其是一直做2D游戏开发的童鞋门,从J2me到Android,很多做Android的都是从J2me过来的...
发布:鸡啄米
&&&&&&&贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋。一般的矢量图形软件常利用贝塞尔曲线来精确画出曲线。 上面的介绍中,“线段像可伸缩的皮筋”这句话非常关键,但也特别好理解。
发布:鸡啄米
&&&&&&&本节为大家提供有关物理游戏的知识,讲解了一个简单的圆形自由落体Demo的编写。Android游戏开发18:重力传感器在游戏开发中的应用中讲了重力传感器的使用,本文要介绍的重力系统实际上是类似的。 在重力传感器中,虽然我也实现了一个圆形会根据手机反转的角度而拥有不同的速度,但是其内置加速度算法都是Android os封装好的...
发布:鸡啄米
&&&&&&&有不少朋友都遇到过这种问题,程序执行时切换到后台,然后再重新进入会报异常,本文就这种问题全面讲解下SurfaceView的运行机制,了解了这些原理你就能自己解决这些问题了。 我们通常会通过单击HOME按键或返回按键等操作切换到后台,之后可能会再次进入程序,这个时候就有可能报异常。
发布:鸡啄米
&&&&&&&手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性。本节将继续介绍智能手机的另一种神奇之处:传感器。 一、何为传感器
所谓传感器就是能够探测如光、热、温度、重力、方向等等的装置。
发布:鸡啄米
&&&&&&&进行软件开发时,通常我们都喜欢使用较新版本的工具,但这里我为什么使用低版本的SDK来开发Android游戏呢?这里介绍下原因: 1、Android SDK 属于向下兼容!那么低版本可以运行的,高版本基本上更是没问题!(当然每次SDK的更新也会带来新功能,或者修改了一些原来的BUG等等,那么其实对于游戏开发来说,如果你的游戏中不需要更高的SDK版本的支持情况下,完全不必去追求最新的SDK!)
发布:鸡啄米
&&&&&&&在Android游戏开发4中讲解了使用一张13帧的png图片,采用设置可视区域的方式来实现动画效果,但这是我们手动实现的,实际上Android提供了两种自定义动画的方式:Frame By Frame帧动画和Tween Animation 渐变动画。下面分别介绍: 第一类:Frame By Frame帧动画(不推荐在游戏开发中使用)...
发布:鸡啄米
&&&&&&&智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣。实际上多点触控程序的实现并不是那么遥不可及,而是比较容易。本文就主要通过一个实例具体讲解多点触控程序的实现。 首先来了解一下Android中多点触控的原理。
发布:鸡啄米
&&&&&&&上一节中讲了如何在SurfaceView中添加Button、TextView等组件,基本已经成功了。但如果是在开发Android游戏的话,你肯定不希望我们的SurfaceView只占了中间一部分,就像播放电影一样,而是想让它占据尽可能多的空间,也就是全屏显示。
发布:鸡啄米
&&&&&&&SurfaceView中如何添加系统组件,如我们经常会用到的EditText、TextView、Button等,让很多朋友非常纠结。网上常见到有童鞋在寻找此问题的答案。本文就和各位分享下SurfaceView中添加组件的方法。 1、因为我们的SurfaceView是个View,对于添加的组件其实也是View,如果我们只是一味的想在SurfaceView中添加View组件其实是错误的思想...
发布:鸡啄米
&&&&&&&上一节中对SurfaceView的分析实际上就是一个简单的游戏框架了。当然这里再强调一下,是简单的游戏框架,高手们不要乱喷哦~ 这个Demo是写的一个对图片操作以及按键处理、游戏简单框架的demo,这里放出给大家分享~
发布:鸡啄米
&&&&&&&上一节中我们对Android游戏开发中的View类和SurfaceView类作了讲解,并进行了对比,得出的结论是SurfaceView类更适合在Android游戏开发中应用。下面我们就详细分析SurfaceView的结构和用法。 首先贴一段实例代码:...
发布:鸡啄米
&&&&&&&前几篇文章是对Android示例程序贪吃蛇Snake程序的剖析,本文继续分析Android自带的另一个小游戏LunarLander的程序。在贪吃蛇Snake程序中采用了&定时器+系统调用onDraw&的架构,而LunarLander程序采用的是&多线程+强制自行绘制&的架构思路,比前者更为实用。
发布:鸡啄米
&&&&&&&在Android游戏开发中比较重要同时也比较复杂的就是显示和游戏逻辑的处理,所以用到的主要的类除了控制类就属显示类了,在J2ME中通过Display和Canvas类来实现显示,而Android中为视图显示提供了View类。 SurfaceView类...
发布:鸡啄米
&&&&&&&本节讲解使用SurfaceView组件绘制动画的方法。SurfaceView类作为View类的子类,进行绘图时能够比一般的View组件更快,所以我们在Android游戏、视频等对流畅度和帧速要求较高的应用中经常会见到SurfaceView的身影。 本文通过实例讲解的方式来介绍SurfaceView的使用方法,此实例实现的是一个能发送莫尔斯码的灯塔。
发布:鸡啄米
&&&&&&&本节使用系统的示例类VideoView继续SurfaceView类相关内容的讲解,以让大家能更深入理解Android系统中图形绘制基础类的实现原理。也许你会发现无法改变VideoView类的控制方面,我们可以通过重构VideoView类来实现更加个性化的播放器。 下面是VideoView类的相关代码。
发布:鸡啄米
完全随机文章[android]两个 surfaceView 之间切换
我有两个 surfaceView,只有一个人在一次添加到视图层次,另一个删除,我的问题是,当 surfaceView 添加,有即时的黑色矩形覆盖它,可以避免这种情况吗?
下面是测试代码:
public class MainActivity extends Activity {
private SurfaceView mSurfaceV
private SurfaceView mSurfaceView1;
private SurfaceHolder.Callback mSurfaceC
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rv = this.getWindow().getDecorView();
final FrameLayout frameLayout = (FrameLayout) this.getWindow().getDecorView()
.findViewById(android.R.id.content);
final LinearLayout ll = new LinearLayout(this);
mSurfaceView = new SurfaceView(this);
mSurfaceView1= new SurfaceView(this);
mSurfaceCallback = new SurfaceHolder.Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
public void surfaceCreated(SurfaceHolder holder) {
Canvas c =
c = holder.lockCanvas();
c.drawColor(Color.GREEN);
Paint p = new Paint();
p.setColor(Color.WHITE);
Rect r = new Rect(100, 50, 300, 250);
c.drawRect(r, p);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
public void surfaceDestroyed(SurfaceHolder holder) {}
mSurfaceView.getHolder().addCallback(mSurfaceCallback);
mSurfaceView1.getHolder().addCallback(mSurfaceCallback);
Button b = new Button(this);b.setText("view1");
Button c = new Button(this);c.setText("view2");
b.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
ll.addView(mSurfaceView);
ll.removeView(mSurfaceView1);
}catch(Exception e) {}
c.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
ll.addView(mSurfaceView1);
ll.removeView(mSurfaceView);
}catch(Exception e) {}
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(b, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
ll.addView(c, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
frameLayout.addView(ll);
解决方法 1:
我觉得当你打电话时,您可以添加两个 surfaceviews onCreate ,并切换其地位在 onClick .这样的:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rv = this.getWindow().getDecorView();
final FrameLayout frameLayout = (FrameLayout) this.getWindow().getDecorView()
.findViewById(android.R.id.content);
final LinearLayout ll = new LinearLayout(this);
mSurfaceView = new SurfaceView(this);
mSurfaceView1= new SurfaceView(this);
mSurfaceCallback = new SurfaceHolder.Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
public void surfaceCreated(SurfaceHolder holder) {
Canvas c =
c = holder.lockCanvas();
c.drawColor(Color.GREEN);
Paint p = new Paint();
p.setColor(Color.WHITE);
Rect r = new Rect(100, 50, 300, 250);
c.drawRect(r, p);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
public void surfaceDestroyed(SurfaceHolder holder) {}
mSurfaceView.getHolder().addCallback(mSurfaceCallback);
mSurfaceView1.getHolder().addCallback(mSurfaceCallback);
Button b = new Button(this);b.setText("view1");
Button c = new Button(this);c.setText("view2");
b.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
ll.addView(mSurfaceView);
ll.removeView(mSurfaceView1);
mSurfaceView.setVisibility(View.VISIBLE);
mSurfaceView1.setVisibility(View.INVISIBLE);
}catch(Exception e) {}
c.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
ll.addView(mSurfaceView1);
ll.removeView(mSurfaceView);
mSurfaceView1.setVisibility(View.VISIBLE);
mSurfaceView.setVisibility(View.INVISIBLE);
}catch(Exception e) {}
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(b, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
ll.addView(c, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
// add mSurfaceView & mSurfaceView1
ll.addView(mSurfaceView);
ll.addView(mSurfaceView1);
mSurfaceView.setVisibility(View.INVISIBLE);
mSurfaceView1.setVisibility(View.INVISIBLE);
frameLayout.addView(ll);

我要回帖

更多关于 uicollectionview重叠 的文章

 

随机推荐