簡體   English   中英

如何在Android Java中編寫可滾動SurfaceView?

[英]How do I program a Scrollable SurfaceView in Android Java?

我正在嘗試繪制比屏幕大的圖像,並讓用戶在其周圍滾動。 該圖像是一些圖表,這些圖表是由我的代碼根據一些數據計算得出的。 (這是在使用Java的Android中)。

我想要的是可以由用戶滾動的View(實際上是SurfaceView)。 我曾嘗試將SurfaceView放入ScrollView中,但是SurfaceView繪制的整個圖像非常大,因此(a)存在性能問題,因為我的應用程序在只需要執行其中的部分時正在繪制整個SurfaceView。視口和(b)我的應用因“尺寸太大...內存不足”錯誤而崩潰。

如果View可以實現滾動(僅垂直),然后將y值傳遞給我的代碼,以便可以在視口中繪制圖像的可見部分,那將是對我最好的選擇。

另外,我可以捕獲“鼠標”事件並自己計算y值。

有人有任何代碼可以執行此操作嗎?

更新:我應該澄清一下,圖像是使用Canvas.drawLine()之類的程序代碼繪制的。 我可以計算圖像的哪些部分適合我的視口,前提是我將滾動狀態設為y值,並且可以通過減去滾動y值來計算每個點的絕對y坐標。 我需要的是可以在用戶滾動圖像時找到的東西以及產生的y值。 滾動條也很好。

更新:我正在使用SurfaceView,以便可以從另一個線程更新圖像,從而提高用戶界面性能。

您可以簡單地使用WebView來顯示圖像

  • 提供鍋
  • 提供變焦
  • 無需圖書館
  • 有一個滾動條

Android:使WebView顯示位圖的最簡單方法?

我不確定我是否真的遇到了你的問題...

如果您確實只有繪圖內容...您不需要可滾動的客戶端,那么...

  • 有模型(x,y,線等)
  • 平移和縮放
  • 繪制模型的縮放/縮放實例

只是繪制內容(抱歉-此解決方案中沒有滾動條)

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean isProcessed = scaleGestureDetector.onTouchEvent(event);

    if (isProcessed) {

        // Handle touch events here...
        switch (event.getAction() & MotionEvent.ACTION_MASK) {

        case MotionEvent.ACTION_DOWN:
            start.set(event.getX(), event.getY());
            tap( event.getX(), event.getY() );
            mode = DRAG_OR_TAP;
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            break;
        case MotionEvent.ACTION_UP: 
            break;
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            break;
        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG_OR_TAP) {
                doPan(event.getX() - start.x, event.getY() - start.y);
                start.set(event.getX(), event.getY());
            }
            break;
        }
    }

    myView.scale(currentPan, currentScaleFactor);

    invalidate();
    return true;
}

private void doPan(float panX, float panY) {        
    currentPan.x = currentPan.x + panX;
    currentPan.y = currentPan.y + panY;

}

private void tap(float x, float y) {
    ...
}

最后同樣重要的是使用scaleListener

private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener {

    @Override
    public boolean onScale(ScaleGestureDetector detector) {

        float value = detector.getScaleFactor();
        currentScaleFactor = currentScaleFactor * value;

        // don't let the object get too small or too large.
        boolean doesntMatch = false;
        if (currentScaleFactor < 1f || currentScaleFactor > 20f){
            currentScaleFactor = Math.max(1f, Math.min(currentScaleFactor, 20f));
            doesntMatch = true;
        }

        if(!doesntMatch){
            //scale the viewport as well
            currentPan.x = currentPan.x*value;
            currentPan.y = currentPan.y*value;

        }
        return true;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM