android - viewflipper 中 surfaceview 的渲染问题?

标签 android surfaceview android-animation

我正在通过将 surfaceview 扩展到 PieChart 类来绘制饼图。现在我正在为 Piechart 创建 2 个对象并添加到 VieWFlipper 以在这些图表之间滑动。现在我的问题是,如果用户滑动到第二个 View ,则第二个饼图对用户不可见。但所有第二个馅饼功能都在工作。我在想它的表面 View 刷新问题。

在这方面的任何帮助都将不胜感激。以下是我的 PieChart 类。

class MyPieChart extends SurfaceView implements SurfaceHolder.Callback {

    @Override
    public void onDraw(Canvas canvas) {
        if (hasData) {
            resetColor();
            try {
                canvas.drawColor(getResources().getColor(R.color.graphbg_color));

                graphDraw(canvas);
            } catch (ValicException ex) {

            }

        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

        Log.i("PieChart", "surfaceChanged");

    }

    public int callCount = 0;

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if ((callCount++) % 2 == 0) {
            callCount = 1;
            try {
                 Log.i("PieChart", "surfaceCreated");
                mChartThread = new ChartThread(getHolder(), this);
                mChartThread.setRunning(true);

                if (!mChartThread.isAlive()) {
                    mChartThread.start();
                }

                mFrame = holder.getSurfaceFrame();

                mOvalF = new RectF(0, 0, mFrame.right, mFrame.right);

            } catch (Exception e) {
                // No error message required
            }
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
         Log.i("PieChart", "surfaceDestroyed");
        boolean retry = true;
        callCount = 0;
        mChartThread.setRunning(false);
        while (retry) {
            try {
                mChartThread.join();
                retry = false;
            } catch (InterruptedException e) {
                // No error message required
            }
        }
    }
}

class ChartThread extends Thread {
    private SurfaceHolder mSurfaceHolder;
    private PieChart mPieChart;
    private boolean mRefresh = false;

    public ChartThread(SurfaceHolder surfaceHolder, PieChart pieChart) {
        // Log.i("ChartThread", "ChartThread");
        mSurfaceHolder = surfaceHolder;
        mPieChart = pieChart;
    }

    public void setRunning(boolean Refresh) {
        // Log.i("ChartThread", "setRunning : " + Refresh);
        mRefresh = Refresh;
    }

    @Override
    public void run() {
        Canvas c;
        // Log.i("ChartThread", "run : " + mRefresh);
        while (mRefresh) {
            c = null;
            try {
                c = mSurfaceHolder.lockCanvas(mPieChart.mFrame);
            //  c.drawColor(0xFFebf3f5);
                synchronized (mSurfaceHolder) {

                    mPieChart.onDraw(c);

                }
            } catch (Exception ex) {

            } finally {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                if (c != null) {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }
}

这是我的 flipper.xml

<ViewFlipper  
android:id="@+id/flipper"
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<LinearLayout  android:id="@+id/pie1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" />

<LinearLayout android:id="@+id/pie2" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" />

这是我的 Activity

public class ViewFlipperActivity extends Activity {
    Button b1;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        b1 = (Button)findViewById(R.id.submit1);

        b1.setOnClickListener(new View.OnClickListener() {
            ViewFlipper vflipper=(ViewFlipper)findViewById(R.id.flipper);   
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                vflipper.showNext();

            }
        });

    }

我正在将饼图添加到 Flipper 中的 Pie1 和 Pie2 LinearLayouts。

两个饼图都已创建并粘贴到饼图布局中。现在,如果我移动到鳍状肢中的第二个 View ,则显示 Pie1 而不是 pie2,并且我获得的所有其他数据和功能都与 Pie2 相关。我怀疑 Pie2 正在渲染并隐藏在 Pie1 下。任何人都可以通过一些解决方案帮助我解决这个问题。

我在这个问题上取得了突破。这导致了以下更改的另一个问题。

在 flipper.xml 中替换了 LinearLayout i 的 view flipper 位置。

    <LinearLayout  
    android:id="@+id/flipper"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <LinearLayout  android:id="@+id/pie1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" />

   </LinearLayout  >

在 ViewFlipperActivity 中

    public class ViewFlipperActivity extends Activity {
        Button b1;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            b1 = (Button)findViewById(R.id.submit1);

            b1.setOnClickListener(new View.OnClickListener() {
                LinearLayout vflipper=(LinearLayout)findViewById(R.id.flipper); 
LinearLayout pie1=(LinearLayout)findViewById(R.id.pie1);    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                    vflipper.setAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));

pie1.removeAllViews();
pie1.addView(PieChart/SurfaceView);

                }
            });

        }

动画效果很好,饼图在 View 上发生了变化。但是在饼图之间滑动时, block 矩形从表面 View 中可以看到一秒钟。有人可以帮我解决这个问题吗。

最佳答案

SurfaceView 无法在 ViewFlipper 中正常工作,因为它无法正确设置动画。这就是为什么 Android 4.0 引入了一个名为 TextureView 的新小部件来解决这个问题。

关于android - viewflipper 中 surfaceview 的渲染问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8085300/

相关文章:

android - 即使从设置中打开权限后,Settings.canDrawOverlays 仍返回 false

android - 使用 Media Recorder Android 以 block 形式录制视频

android - 关闭 UI 线程运行 SurfaceView

android - 设置 FloatingActionButton 波纹

android - 灰度图片Drawable

Android:在不同 Android 版本上使用 SAX 解析器时出现问题

java - Android - 如何在游戏中正确适配位图?

android - 使用 Twilio 视频流式传输 CustomView ARcore

android - 如何在约束布局上为嵌套 View 设置动画?

android - 将布局滑动到屏幕中间(向上滑动),然后向上或向下滑动