如何在Android中使用GLSurfaceView通信BroadcastReceiver?

时间:2017-09-30 01:05:49

标签: java android opengl-es broadcastreceiver glsurfaceview

在我的应用程序中,我实现了一个名为BatteryBroadcastReceiver的自定义BroadcastReceiver,其目的是通知我电池的充电状态(“充电器已连接”,“充电器已断开连接”)。我在我的MainActivity中注册了这个BatteryBroadcastReceiver,它与Toasts配合得很好。另一方面,我有一个带渲染器的GLSurfaceView,它也很棒。

现在我需要GLSurfaceView来监听BatteryBroadcastReceiver,以便通过GLSurfaceView调用我的自定义Renderer方法(renderer.setMotion(“somestring”))。

这是BatteryBroadcastReceiver类:

public class BatteryBroadcastReceiver extends BroadcastReceiver {

    public BatteryBroadcastReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        int batteryLevel = intent.getIntExtra(
                BatteryManager.EXTRA_LEVEL, 0);
        int maxLevel = intent
                .getIntExtra(BatteryManager.EXTRA_SCALE, 0);

        float batteryPercentage = ((float) batteryLevel / (float) maxLevel) * 100;

        if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            Toast.makeText(context, "Conectaste el cargador", Toast.LENGTH_SHORT).show();
        } else {
            intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED);
            Toast.makeText(context, "Desconectaste el cargador", Toast.LENGTH_SHORT).show();
        }
    }
}

这是MainActivity:

public class MainActivity extends AppCompatActivity {

    private GLSurfaceView glsv_main;
    private BatteryBroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        glsv_main = new SampleGLSurfaceView(this);

        Live2D.init();
        setContentView(glsv_main);

    }

    @Override
    protected void onResume() {
        super.onResume();

        receiver = new BatteryBroadcastReceiver();

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_POWER_CONNECTED);
        intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();

        unregisterReceiver(receiver);
    }
}

这是GLSurfaceView类:

public class SampleGLSurfaceView extends GLSurfaceView
{
    private SampleGLRenderer renderer ;

    public SampleGLSurfaceView(Context context)
    {
        super(context);

        renderer = new SampleGLRenderer() ;
        setRenderer(renderer) ;
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {

        switch (e.getAction()) {
            case MotionEvent.ACTION_UP:
                renderer.setMotion("asuna/common/motions/surprise/0.mtn");
        }
        return true;
    }

    class SampleGLRenderer implements Renderer
    {
        private Live2DModelAndroid live2DModel;
        private Live2DMotion live2DMotion;
        private MotionQueueManager motionManager = new MotionQueueManager();

        private final String MODEL_PATH = "asuna/07/model.moc" ;
        private final String TEXTURE_PATHS[] =
                {
                        "asuna/common/textures/0.png",
                        "asuna/common/textures/1.png",
                        "asuna/07/textures/2.png",
                        "asuna/07/textures/3.png",
                } ;
        private final String PHYSICS_PATH = "asuna/07/physics.json";
        //private final String POSE_PATH = "haru/haru.pose.json";
        private final String MOTION_IDLE[] =
                {
                        "asuna/common/motions/idle/0.mtn",
                        "asuna/common/motions/idle/1.mtn",
                        "asuna/common/motions/idle/2.mtn",
                } ;
        private final String EXPRESSION_PATHS[] =
                {
                        "asuna/common/expressions/ANGRY.json",
                        "asuna/common/expressions/FUN.json",
                        "asuna/common/expressions/FUN_HANIKAMI.json",
                        "asuna/common/expressions/FUN_MAX.json",
                        "asuna/common/expressions/FUN_SMILE.json",
                        "asuna/common/expressions/FUN_WARM.json",
                        "asuna/common/expressions/NOMAL.json",
                        "asuna/common/expressions/SAD.json",
                        "asuna/common/expressions/SLEEP.json",
                        "asuna/common/expressions/SURPRISE.json",
                } ;
        //private final String SOUND_PATHS[] = {};

        @Override
        public void onDrawFrame(GL10 gl)
        {
            gl.glMatrixMode(GL10.GL_MODELVIEW ) ;
            gl.glLoadIdentity() ;
            gl.glClear( GL10.GL_COLOR_BUFFER_BIT ) ;
            gl.glEnable( GL10.GL_BLEND ) ;
            gl.glBlendFunc( GL10.GL_ONE , GL10.GL_ONE_MINUS_SRC_ALPHA ) ;
            gl.glDisable( GL10.GL_DEPTH_TEST ) ;
            gl.glDisable( GL10.GL_CULL_FACE ) ;

            live2DModel.loadParam();

            if(motionManager.isFinished())
            {
                setRamdomIdle();
                //If you have only 1 motion
                motionManager.startMotion(live2DMotion, false); // Play the motion inside live2Dmotion variable
            }
            else
            {
                motionManager.updateParam(live2DModel); // Asocia el motion que esta corriendo actualmente con el modelo
            }
            motionManager.updateParam(live2DModel);

            live2DModel.saveParam();

            live2DModel.setGL( gl ) ;
            live2DModel.update() ;
            live2DModel.draw() ;

        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height)
        {
            gl.glViewport( 0 , 0 , width , height ) ;

            gl.glMatrixMode( GL10.GL_PROJECTION ) ;
            gl.glLoadIdentity() ;

            float modelWidth = live2DModel.getCanvasWidth();
            float visibleWidth = modelWidth * (3.0f/4.0f);
            float margin = 0.5f * ( modelWidth/4.0f ) ;

            gl.glOrthof(margin, margin+visibleWidth, visibleWidth*height/width, 0, 0.5f, -0.5f);
        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config)
        {
            try
            {
                InputStream in = getContext().getAssets().open(MODEL_PATH);
                live2DModel = Live2DModelAndroid.loadModel(in);
                in.close() ;
                // live2DModel configuration ARM_L_B_001
                //live2DModel.setPartsOpacity("PARTS_01_ARM_L_A_001", (float) 0.0);
                //live2DModel.setPartsOpacity("PARTS_01_ARM_R_A_001", (float) 0.0);
                // --------------------------

                // live2DMotion configuration
                // --------------------------

                for (int i = 0; i < TEXTURE_PATHS.length; i++ )
                {
                    InputStream tin = getContext().getAssets().open( TEXTURE_PATHS[i] ) ;
                    int texNo = UtOpenGL.loadTexture(gl , tin , true );
                    live2DModel.setTexture( i , texNo );

                    //InputStream min = getContext().getAssets().open( MOTION_PATHS[i] ) ;
                    //int motNo = UtOpenGL.loadTexture(gl , tin , true ) ;
                    //live2DMotion.loadMotion(min) ;

                }

            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        public void setMotion(String mtn) {
            try {
                InputStream min = getContext().getAssets().open(mtn);
                live2DMotion = Live2DMotion.loadMotion(min);
                min.close();
                motionManager.startMotion(live2DMotion, false);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        public void setRamdomIdle() {
            Random rand = new Random();
            int  n = rand.nextInt(3);
            try {
                InputStream min = getContext().getAssets().open(MOTION_IDLE[n]);
                live2DMotion = Live2DMotion.loadMotion(min);
                min.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

0 个答案:

没有答案