在 LinearLayout 上使用个人 SurfaceView
Using personal SurfaceView on LinearLayout
我目前正在开发一个 Android 应用程序,使用个人 SurfaceView
和双缓冲。但是我的代码有点问题。
一方面,我有一个基于 LinearLayout
层次结构的 xml 视图。当我实例化我的活动时,我将我的 contentView
设置在此 xml 上。问题是我的双缓冲不再起作用了。线程正在运行但未显示任何内容。
另一方面,我用新的个人 SurfaveView
元素设置 contentView
并且显示效果很好。但是当然,我无法再访问 LinearLayout
.
的其他元素
实际上,我想在我的 xml 视图上设置我的 contentView
并且 保持我的显示工作。
我希望我已经足够清楚了,谢谢你的回答!
这是我的活动:
public class MainController extends Activity {
@Override
protected void onCreate(final Bundle p_savedInstanceState) {
super.onCreate(p_savedInstanceState);
setContentView(R.layout.main_controller_activity);
this.drawableView = (MCustomDrawableView) findViewById(R.id.drawingBox);
...
}
...
}
我的表面观点:
public class MCustomDrawableView extends SurfaceView {
public MCustomDrawableView(Context p_context, AttributeSet p_attributes) {
super(p_context, p_attributes);
this.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(final SurfaceHolder p_holder) {
try {
// Instantiating a new thread
thread = new MBufferingThread(getInstance());
thread.start();
} catch (Exception exception) {
exception.printStackTrace();
}
}
@Override
public void surfaceChanged(final SurfaceHolder p_holder, int p_format, int p_width, int p_height) {...}
@Override
public void surfaceDestroyed(final SurfaceHolder p_holder) {...}
});
// Setup drawing options
setupDrawing();
}
...
}
还有我的 xml 观点:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="@color/app_background"
tools:context=".MainController">
<com.iskn.calligraphy.models.draw.MCustomDrawableView
android:id="@+id/drawingBox"
style="@style/DrawingBox" />
<SeekBar
android:id="@+id/brushSize"
style="@style/SizeSeekBar" />
<SeekBar
android:id="@+id/brushOpacity"
style="@style/OpacitySeekBar" />
</LinearLayout>
编辑:
经过进一步的研究和分析,显然:
setContentView(R.layout.main_controller_activity)
:在这种情况下,我从我的活动中获取所有元素,但 MCustomDrawableView
不显示任何内容。
setContentView(new MCustomDrawableView(getApplicationContext()))
:在那种情况下,MCustomDrawableView
运行良好(它显示了我想要的),但我的 [=25= 中没有其他 View
]
在这两种情况下:
- 我的线程正在运行并且运行良好。
- 我的绘图函数也被调用,使用
holder.lockCanvas()
和 holder.unlockCanvasAndPost(bufferCanvas)
方法。
好吧,我找到了一个实用的解决方案:
我认为问题出在 MCustomDrawableView
初始化上。我从 onCreate
方法而不是 xml 文件创建了 class 的新实例。然后,我将它设置为 contentView
:
protected void onCreate(Bundle p_savedInstanceState) {
super.onCreate(p_savedInstanceState);
setContentView(R.layout.main_controller_activity);
// Instantiate drawable object & set style properties
this.drawableView = new MCustomDrawableView(getApplicationContext());
FrameLayout.LayoutParams style = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
// Add the drawable view to the main_activity
addContentView(this.drawableView, style);
}
但是这种方式又带来了新的问题。添加的视图在顶部,这意味着所有其他视图 View
都被隐藏了。我用下面的方法 bringToBack(this.drawableView)
解决了这个问题:
private void bringToBack(View p_view) {
// Get parent from the current view
ViewGroup viewGroup = ((ViewGroup) p_view.getParent());
int childrenCount = viewGroup.indexOfChild(p_view);
for(int cpt = 0; cpt < childrenCount; cpt++) {
// Move the child to the top
viewGroup.bringChildToFront(viewGroup.getChildAt(cpt));
}
}
它将提供的视图带回背景位置。我还必须将 LinearLayout 的 alpha 设置为 0。
我仍然愿意接受其他解决方案!
我目前正在开发一个 Android 应用程序,使用个人 SurfaceView
和双缓冲。但是我的代码有点问题。
一方面,我有一个基于 LinearLayout
层次结构的 xml 视图。当我实例化我的活动时,我将我的 contentView
设置在此 xml 上。问题是我的双缓冲不再起作用了。线程正在运行但未显示任何内容。
另一方面,我用新的个人 SurfaveView
元素设置 contentView
并且显示效果很好。但是当然,我无法再访问 LinearLayout
.
的其他元素
实际上,我想在我的 xml 视图上设置我的 contentView
并且 保持我的显示工作。
我希望我已经足够清楚了,谢谢你的回答!
这是我的活动:
public class MainController extends Activity {
@Override
protected void onCreate(final Bundle p_savedInstanceState) {
super.onCreate(p_savedInstanceState);
setContentView(R.layout.main_controller_activity);
this.drawableView = (MCustomDrawableView) findViewById(R.id.drawingBox);
...
}
...
}
我的表面观点:
public class MCustomDrawableView extends SurfaceView {
public MCustomDrawableView(Context p_context, AttributeSet p_attributes) {
super(p_context, p_attributes);
this.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(final SurfaceHolder p_holder) {
try {
// Instantiating a new thread
thread = new MBufferingThread(getInstance());
thread.start();
} catch (Exception exception) {
exception.printStackTrace();
}
}
@Override
public void surfaceChanged(final SurfaceHolder p_holder, int p_format, int p_width, int p_height) {...}
@Override
public void surfaceDestroyed(final SurfaceHolder p_holder) {...}
});
// Setup drawing options
setupDrawing();
}
...
}
还有我的 xml 观点:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="@color/app_background"
tools:context=".MainController">
<com.iskn.calligraphy.models.draw.MCustomDrawableView
android:id="@+id/drawingBox"
style="@style/DrawingBox" />
<SeekBar
android:id="@+id/brushSize"
style="@style/SizeSeekBar" />
<SeekBar
android:id="@+id/brushOpacity"
style="@style/OpacitySeekBar" />
</LinearLayout>
编辑:
经过进一步的研究和分析,显然:
setContentView(R.layout.main_controller_activity)
:在这种情况下,我从我的活动中获取所有元素,但MCustomDrawableView
不显示任何内容。setContentView(new MCustomDrawableView(getApplicationContext()))
:在那种情况下,MCustomDrawableView
运行良好(它显示了我想要的),但我的 [=25= 中没有其他View
]
在这两种情况下:
- 我的线程正在运行并且运行良好。
- 我的绘图函数也被调用,使用
holder.lockCanvas()
和holder.unlockCanvasAndPost(bufferCanvas)
方法。
好吧,我找到了一个实用的解决方案:
我认为问题出在 MCustomDrawableView
初始化上。我从 onCreate
方法而不是 xml 文件创建了 class 的新实例。然后,我将它设置为 contentView
:
protected void onCreate(Bundle p_savedInstanceState) {
super.onCreate(p_savedInstanceState);
setContentView(R.layout.main_controller_activity);
// Instantiate drawable object & set style properties
this.drawableView = new MCustomDrawableView(getApplicationContext());
FrameLayout.LayoutParams style = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
// Add the drawable view to the main_activity
addContentView(this.drawableView, style);
}
但是这种方式又带来了新的问题。添加的视图在顶部,这意味着所有其他视图 View
都被隐藏了。我用下面的方法 bringToBack(this.drawableView)
解决了这个问题:
private void bringToBack(View p_view) {
// Get parent from the current view
ViewGroup viewGroup = ((ViewGroup) p_view.getParent());
int childrenCount = viewGroup.indexOfChild(p_view);
for(int cpt = 0; cpt < childrenCount; cpt++) {
// Move the child to the top
viewGroup.bringChildToFront(viewGroup.getChildAt(cpt));
}
}
它将提供的视图带回背景位置。我还必须将 LinearLayout 的 alpha 设置为 0。
我仍然愿意接受其他解决方案!