GVKun编程网logo

Android中奇怪的行为替换片段

10

对于想了解Android中奇怪的行为替换片段的读者,本文将是一篇不可错过的文章,并且为您提供关于android–Andengine奇怪的纹理问题、android–Rajawali旋转相机与Sensor

对于想了解Android中奇怪的行为替换片段的读者,本文将是一篇不可错过的文章,并且为您提供关于android – Andengine奇怪的纹理问题、android – Rajawali旋转相机与Sensor.TYPE_ROTATION_VECTOR奇怪的行为、android – 九补丁图像显示奇怪的行为?、android – 动画时奇怪的错误(Adreno,GL)的有价值信息。

本文目录一览:

Android中奇怪的行为替换片段

Android中奇怪的行为替换片段

我已经在一个应用程序中工作了几个月.上传到Playstore的版本运行正常.最近,通过一些改进,整个应用程序开始以一种非常奇怪的方式工作.

如果您在片段之间进行切换,则过一会儿它无法正确地使片段膨胀,因此始终放置第一个片段的内容.因此,如果您切换片段,则操作栏会发生变化,但内容始终相同(并且您无法与其进行交互).

这是错误https://streamable.com/9exa的快速视频

我快要疯了,因为没有任何日志或跟踪.

我使用的是分割片段的常用方法,最有趣的部分是,一开始一切正常:

Fragment fragment = getSelectedFragment(index); // returns the desired fragment
FragmentManager fragmentManager = getFragmentManager();

//Pop backstack
for(int i = 0; i < fragmentManager.getBackStackEntryCount(); ++i) {
    fragmentManager.popBackStack();
}

fragmentManager.beginTransaction()
               .replace(R.id.container, fragment)
               .addToBackStack(null)
               .commit();

有谁知道这里会发生什么?谢谢!

编辑:如果有问题,我也曾尝试清除后盖,但它并没有改变任何东西

已解决:正如我在回答中解释的那样,我发现这是与SwipeRefreshLayout有关的问题.有关此问题的更多信息,请参见When switch fragment with SwipeRefreshLayout during refreshing, fragment freezes but actually still work.

解决方法:

好的,我发现了问题所在.

似乎SwipeRefreshLayout是引起所有问题的那个.我的一个片段正在使用它,在切换片段几次后,它被卡住了.

删除它或禁用它setEnabled(false)解决了所有问题.

我希望它将对遇到相同问题的任何人有所帮助!

SO中的另一个线程引用相同的问题:When switch fragment with SwipeRefreshLayout during refreshing, fragment freezes but actually still work

android – Andengine奇怪的纹理问题

android – Andengine奇怪的纹理问题

我正在尝试使用Andengine开发游戏.自从我上次使用andengine以来已经有一段时间了,所以我下载了最新的andengine.jar.
Texture类更改为BitmapTextureAtlas
所以我使用了BitmapTextureAtlas而不是纹理.一切都很好,除了质地的质量改变.虽然使用纹理很好,但使用BitmapTextureAtlas,它有一些奇怪的像素边框,在每次开始时都显得不同.有时或多或少

下面是纹理外观图像的链接:

我尝试了不同的东西,但它没有去.当我使用Texture时没有看到这个问题
我希望有人知道如何解决这个问题.

解决方法:

我不认为当前的AndEngine版本在互联网上有.jar文件.它可能是旧版本.

尝试自己克隆AndEngine,这样您就拥有了最新版本.

android – Rajawali旋转相机与Sensor.TYPE_ROTATION_VECTOR奇怪的行为

android – Rajawali旋转相机与Sensor.TYPE_ROTATION_VECTOR奇怪的行为

我正在创建一个全景视图,允许用户通过旋转智能手机环顾一下球形图像.我将Rajawali的SkyBox与TYPE_ROTATION_VECTOR传感器一起使用.

我得到了它的工作,但只有当我向前看时(它实际上是基于我的旋转(偏航))

这是行为:

>期待:yaw = yaw,pitch = pitch and roll = roll
>向左看:yaw = yaw,pitch = roll and roll = pitch
>向后看:yaw = yaw,pitch = pitch * -1和roll = roll * -1.

现在我确实有预感正在发生什么.似乎“相机对象”一直看着相同的方向,即使它看起来不是这样.这意味着俯仰似乎与滚动相同,但是它仍然在俯仰,因为物体没有旋转.我把它比作飞机上的四处看看.

我需要做些什么来解决这个问题?

我有一种感觉,我将不得不用lookAt()旋转相机,但我不知道如何.

public class SkyBoxFragment extends RajawaliFragment implements SensorEventListener {

    public static final String TAG = "SkyBoxFragment";
    private SensorManager mSensorManager;
    private float[] orientationVals = new float[3];
    private float[] mRotationMatrix = new float[16];
    private Sensor mRotVectSensor;

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        LinearLayout ll = new LinearLayout(getActivity());
        ll.setorientation(LinearLayout.VERTICAL);
        ll.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);
        mSensorManager = (SensorManager) getActivity().getSystemService(
                Context.SENSOR_SERVICE);
        mRotVectSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
        mLayout.addView(ll);
        mSensorManager.registerListener(this,mRotVectSensor,10000);
        return mLayout;
    }

    @Override
    public AExampleRenderer createRenderer() {
        mRenderer = new SkyBoxRenderer(getActivity());
        return ((SkyBoxRenderer) mRenderer);
    }

    @Override
    public void onClick(View v) {

    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
            SensorManager.getRotationMatrixFromVector(mRotationMatrix,event.values);
            SensorManager.remapCoordinateSystem(mRotationMatrix,SensorManager.AXIS_X,SensorManager.AXIS_Z,mRotationMatrix);
            SensorManager.getorientation(mRotationMatrix,orientationVals);
            orientationVals[0] = (float) Math.todegrees(orientationVals[0]);
            orientationVals[1] = (float) Math.todegrees(orientationVals[1]) * -1;
            orientationVals[2] = (float) Math.todegrees(orientationVals[2]) * -1;
            //Log.d(TAG,"YAW:" + orientationVals[0] + " PITCH:" + orientationVals[1] + "ROLL:" + orientationVals[2]);
        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor,int accuracy) {

    }

    private final class SkyBoxRenderer extends AExampleRenderer implements View.OnClickListener {

        private final Vector3 mAccValues;
        boolean odd = true;

        public SkyBoxRenderer(Context context) {
            super(context);
            mAccValues = new Vector3();
        }

        @Override
        protected void initScene() {
            getCurrentCamera().setFarPlane(1000);
            /**
             * SkyBox images by Emil PeRSSon,aka Humus. http://www.humus.name humus@comhem.se
             */
            try {
                getCurrentScene().setSkyBox(R.drawable.posx,R.drawable.negx,R.drawable.posy,R.drawable.negy,R.drawable.posz,R.drawable.negz);
            } catch (ATexture.TextureException e) {
                e.printstacktrace();
            }
        }

        @Override
        protected void onRender(long ellapsedRealtime,double deltaTime) {
            super.onRender(ellapsedRealtime,deltaTime);
            getCurrentCamera().setRotation(orientationVals[2],orientationVals[0],orientationVals[1]);
        }

        @Override
        public void onClick(View v) {
            try {
                if (odd) {
                    /**
                     * SkyBox images by Emil PeRSSon,aka Humus. http://www.humus.name humus@comhem.se
                     */
                    getCurrentScene().updateSkyBox(R.drawable.posx2,R.drawable.negx2,R.drawable.posy2,R.drawable.negy2,R.drawable.posz2,R.drawable.negz2);
                } else {
                    /**
                     * SkyBox images by Emil PeRSSon,aka Humus. http://www.humus.name humus@comhem.se
                     */
                    getCurrentScene().updateSkyBox(R.drawable.posx,R.drawable.negz);
                }
            } catch (Exception e) {
                e.printstacktrace();
            } finally {
                odd = !odd;
            }
        }

        public void setAccelerometerValues(float x,float y,float z) {
            mAccValues.setAll(-x,-y,-z);
        }
    }

}

解决方法

你有两个问题.首先是您要描述的问题,但另一个问题是TYPE_ROTATION_VECTOR的传感器会受到附近磁铁的影响,例如手机外壳中的磁铁.

解决磁铁问题

解决方案可以是使用加速度计和陀螺仪的组合.幸运的是,Google Cardboard SDK已经将其抽象了.

您可以通过使用HeadTracker.createFromContext(this.getActivity())实例化com.google.vrtoolkit.cardboard.sensors.HeadTracker的实例并在其上调用startTracking()来跟踪当前轮换.

现在你不再需要onSensorChanged了.相反,在你的onRender中,你可以这样做:

float[] R = new float[16];
headTracker.getLastHeadView(R,0);

获得旋转矩阵.这解决了您未说明的磁场问题.

让相机正确环顾四周

使用此旋转矩阵将摄像机指向正确方向的最简单方法是将其转换为org.rajawali3d.math.Quaternion,然后调用getCurrentCamera().setCameraOrientation(quaternion);

从float [16]到四元数的转换可能很难正确,但Google Cardboard SDK再一次为您做到了.在这种情况下,它位于不再使用的旧类的源代码中:HeadTransform.

您可以轻松地调整该代码以返回新的Quaternion(w,x,y,z);.

现在,如果没有将orientationVals [1]和orientationVals [2]乘以-1,则会产生与当前代码相同的问题.

然而,通过反转旋转矩阵可以很容易地解决该问题.这将导致onRender中的以下代码(假设getQuaternion(R)返回org.rajawali3d.math.Quaternion):

@Override
protected void onRender(long ellapsedRealtime,double deltaTime) {
    super.onRender(ellapsedRealtime,deltaTime);

    float[] R = new float[16];
    headTracker.getLastHeadView(R,0);

    android.opengl.Matrix.invertM(R,R,0);

    Quaternion q = getQuaternion(R);

    getCurrentCamera().setCameraOrientation(q);
}

android – 九补丁图像显示奇怪的行为?

android – 九补丁图像显示奇怪的行为?

我正在Android中创建一个实现聊天功能的应用程序.我有2种聊天气泡 – 其他用户为蓝色,登录用户为橙色.我正在使用Nine-patch图像来处理这些气泡,因为气泡可以被拉伸.

蓝色气泡中的文字显示正常 – 位于中间(如下图所示).但是橙色气泡中的文字显示在图像上边缘的一些垂直间隙之后.我无法弄清楚为什么会这样.两个气泡都具有相同的属性,并且是按照相同的步骤创建的.请帮忙.提前致谢.

  

这是橙色聊天泡泡:

解决方法:

问题在于九个补丁……右边界定了内容的位置,你可以从讲话泡泡的尖锐部分开始.继续前进到您希望内容开始的边界,它将起作用!

澄清:右边界和底边界定义了内容的去向,顶部和左边界定义了图像需要拉伸时将重复的区域.

试试这个:

android – 动画时奇怪的错误(Adreno,GL)

android – 动画时奇怪的错误(Adreno,GL)

我有两个奇怪的错误,当我为我的视图设置动画时(有一点NineOld Androids的帮助).它很难调试,所以我还不确定,但我认为它可能是由v.setLayerType(View.LAYER_TYPE_HARDWARE,null);引起的.并且有一些绘图问题与此日志一起出现,但它们并不一致.

这些是错误(在不同的活动中引起):

< gl_draw_error_checks:437>:错误:未知:0x506

< qgl2DrvAPI_glStartTilingQCOM:162>:GL_INVALID_VALUE

两者都配有Tag Adreno200-ES20.看起来像是一个OpenGL问题,但我不知道是什么导致它以及如何摆脱它.有什么想法吗?

解决方法

你可以尝试设置
<activity android:hardwareAccelerated="false" />@H_301_15@ 
 

在AndroidManifest.xml中

关于Android中奇怪的行为替换片段的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – Andengine奇怪的纹理问题、android – Rajawali旋转相机与Sensor.TYPE_ROTATION_VECTOR奇怪的行为、android – 九补丁图像显示奇怪的行为?、android – 动画时奇怪的错误(Adreno,GL)的相关知识,请在本站寻找。

本文标签: