[英]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,以便可以從另一個線程更新圖像,從而提高用戶界面性能。
如果您確實只有繪圖內容...您不需要可滾動的客戶端,那么...
只是繪制內容(抱歉-此解決方案中沒有滾動條)
@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.