我写了一个“自定义控件”继承于SurfaceView,在Activity中作为控件加入,已经达到显示的目的,并且觉得比较理想,
可是我在TestUIActivity.Java中 ViewUI g_viewUi = findViewById(R.id.sf_viewui); 却为空
Log.i 输出结果:
2022-12-15 16:23:45.223 19335-19335/com.example.lkftool I/lkfDEBUG: onCreate: g_inputMsg != null
2022-12-15 16:24:32.212 19396-19396/com.example.lkftool I/lkfDEBUG: onCreate: g_editTextLayout != null
2022-12-15 16:25:44.797 19462-19462/com.example.lkftool I/lkfDEBUG: onCreate: g_viewUi = null
可是如果g_viewUi 为空的话,页面上怎么会显示我 通过SurfaceView绘制的画面呢?
ublic class TestUIActivity extends AppCompatActivity implements ViewUI.onValueChangeListener {
private ViewUI g_viewUi;
public FrameLayout g_input_container;
private RelativeLayout g_editTextLayout;
private EditText g_inputMsg;
private Boolean g_showEditText = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
windowsStyleHide();
setContentView(R.layout.activity_test_uiactivity);
init();
g_viewUi = findViewById(R.id.sf_viewui);
g_editTextLayout = (RelativeLayout)findViewById(R.id.re_inputleveer);
g_inputMsg = (EditText) findViewById(R.id.et_inputMsg);
// try{
// //g_viewUi.setonValueChangeListener(this);
// }catch(Exception e){
// Log.i(Config.myTag, "onCreate: "+e.getMessage());
// }
if (g_viewUi == null){
Log.i(Config.myTag, "onCreate: g_viewUi = null");
}else{
Log.i(Config.myTag, "onCreate: g_viewUi != null");
}
}
ViewUI类:
public class ViewUI extends SurfaceView implements SurfaceHolder.Callback {
private boolean g_isReander;//标记是否 开启线程
RenderThread g_RenderThread;
private onValueChangeListener g_onValueChangeListener = null;
public ViewUI(Context context) {
this(context,null);
}
public ViewUI(Context context, AttributeSet attrs) {
this(context,attrs,0);
}
public ViewUI(Context context, AttributeSet attrs, int defStyleAttr) {
super(context);
SurfaceHolder l_SurfaceHolder = getHolder();//获取放映机 (SurfaceView的方法,通过屏幕可以获取 放映机)
l_SurfaceHolder.addCallback(this);//添加回调接口,这样才能在 SurfaceView中回调生命周期中的API
}
/**
* brief 创建屏幕(SurfaceView)时回调该方法
* param 无
* retval 无
*/
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
g_isReander = true;
createElement();
g_RenderThread = new RenderThread(holder, this, g_isReander);
g_RenderThread.start();//开启绘制线程
}
/**
* brief 改变屏幕(SurfaceView)时回调该方法
* param 无
* retval 无
*/
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
}
/**
* brief 结束屏幕(SurfaceView)时回调该方法
* param 无
* retval 无
*/
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
g_isReander = false;//停止绘制线程
g_RenderThread.stop();
}
/*创建各种精灵*/
private void createElement() {
Config.buttonLayout = new ArrayList<BaseModel>();
// Lock_open l_Lock_open = new Lock_open(50, -Config.deviceHeight / 2 + 50);
Lock_open l_Lock_open = Lock_open.getInstance(Config.buttonPoint.x, Config.buttonPoint.y);
Config.buttonLayout.add(l_Lock_open);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// try{
// new TestUIActivity().ShowEditText();
// }catch(Exception e){
// Log.i(Config.myTag, "onTouchEvent: "+e.getMessage());
// }
upDataText();
if (event.getAction() == MotionEvent.ACTION_UP){
// Log.i(Config.myTag, "ViewUI onTouchEvent: ");
for (BaseModel item_model : Config.buttonLayout) {
if (item_model instanceof TouchAble) {//如果该实例实现了TouchAble接口,则向下传递给该实例
if (((TouchAble) item_model).onTouch(event)) {//传递并检测一下实例的Touch事件是否相应
return true;
}
}
}
}
return true;
}
private void upDataText() {
//g_etValue.setText(String.valueOf(f_number));
if (g_onValueChangeListener !=null){
g_onValueChangeListener.onValueChange();
}
}
public void setonValueChangeListener(onValueChangeListener p_listener){
this.g_onValueChangeListener = p_listener;
// try{
//
// }catch(Exception e){
// Log.i(Config.myTag, "onCreate: "+e.getMessage());
// }
}
public interface onValueChangeListener{
void onValueChange();
}
}