2013-04-09 15 views
10

üzerinde ben Android'de bir tuvale çizilen öğelerin üzerine kaydırma temellerini anlama yardıma ihtiyacım var. Bir zaman çizgisi oluşturmak istediğime göre, 0'daki zaman bir görselleştirmenin en üst noktasıdır ve zaman arttıkça zaman çizgisi bir önceki nokta altında oluşturulmaya devam eder. Bunu Android'de yapmak istiyorsam, onDraw() öğesini geçersiz kılarak bir tuvalde birkaç öğe oluşturabileceğimi biliyorum. Ancak, görselleştirmenin ekranın izin verdiğinden daha büyük olduğunu varsayalım. Bunu işlemek gibi büyük kara kutu Aşağıdaki ilk resimde ÖrneğinKaydırma büyük tuval

tüm tuval içerir. Dikey olarak yukarı ve aşağı doğru sarı, yeşil ve mavi renkli dikdörtgenler içeren mavi bir çizgi oluşturuyorum. Kırmızı kutu, görselleştirmeyi gerçekleştiren Android'in ekranını temsil eder. Başlangıçta tüm öğeler açılırken, sadece kırmızı kutuda bulunan öğeler ekranda görünür. kırmızı kutunun sınırları dışına gitmiş ürün vize artık iken temsil gibi kullanıcı aşağı kaydırmak için Şimdi eğer

Before_Scroll

, başlangıçta kırmızı kutunun altında görünen ürün, görünümünde ikinci resim

After_Scroll

ben scrollables kullanmak gerekir inanıyoruz ama oldukça Bunun nasıl kayboldum. Ben kendi müşteri görüntüler oluşturmak için nasıl açıklayan bu sayfayı http://developer.android.com/training/custom-views/custom-drawing.html ve bu sayfada UI interaktif hale getirmek için nasıl açıklayan http://developer.android.com/training/custom-views/making-interactive.html üzerinde okudum, ama ben bir şey eksik düşünüyorum.

bu sorunu göstermektedir örnek bir kod aşağıdaki gibidir (kutular çizgiler go/mantık dikte vb vardır varsayalım bu temel):

package com.example.scrolltest; 

import com.example.scrolltest.Draw; 

import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Color; 

public class MainActivity extends Activity { 
    Draw draw; 

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

    draw = new Draw(this); 
    draw.setBackgroundColor(Color.WHITE); 
    setContentView(draw); 
    } 
} 

ve

package com.example.scrolltest; 


import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.View; 


public class Draw extends View { 
    Paint paint = new Paint(); 

    public Draw(Context context) { 
     super(context);    
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     paint.setColor(Color.GREEN); 
     canvas.drawRect(30, 30, 90, 200, paint); 
     paint.setColor(Color.BLUE); 

     canvas.drawLine(100, 20, 100, 1900, paint); 

     paint.setColor(Color.GREEN); 
     canvas.drawRect(200, 2000, 400, 3000, paint); 
     } 
} 

Yine de anlayamadığım şey, ekranın kapalı olan dikdörtgenlere kaydırmak için kaydırılabilir bir şekilde nasıl kullanacağım. Bunun doğru şekilde başlatılıp başlatılmamasına ya da bunun yerine drawable kullanması gerektiğine de eminim ...

cevap

20

Basit Yöntem (Gerekli yükseklik çok büyük değilse).

Bir ScrollView kullanın ve Çizim görünümünüzü ekleyin. OnMeasure'da bu görünüm için gereken yüksekliği hesaplayın.

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

draw = new Draw(this); 
draw.setBackgroundColor(Color.WHITE); 
ScrollView scrollView = new ScrollView(this); 
scrollView.addView(draw); 
setContentView(scrollView); 
} 

public class Draw extends View { 
     Paint paint = new Paint(); 

     public Draw(Context context) { 
      super(context);    
     } 

     @Override 
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      // Compute the height required to render the view 
      // Assume Width will always be MATCH_PARENT. 
      int width = MeasureSpec.getSize(widthMeasureSpec); 
      int height = 3000 + 50; // Since 3000 is bottom of last Rect to be drawn added and 50 for padding. 
      setMeasuredDimension(width, height); 
     } 

     @Override 
     public void onDraw(Canvas canvas) { 

      paint.setColor(Color.GREEN); 
      canvas.drawRect(30, 30, 90, 200, paint); 
      paint.setColor(Color.BLUE); 

      canvas.drawLine(100, 20, 100, 1900, paint); 

      paint.setColor(Color.GREEN); 
      canvas.drawRect(200, 2000, 400, 3000, paint); 
      } 
    } 
+0

nasıl tuvale özelliğini kaydırma ekleyebilirler? –

0

Bir alternatif offset X/Y değerlerini kullanmak olabilir.

Ofset değerlerini nasıl kullanacağınız size kalmış, ancak bir sınıf kullanmayı tercih etsem de Camera numaralı telefonu arıyorum. Erişim statik olmalıdır.

public void render(Canvas c){ 
    c.drawRect(100 - offsetX, 100 - offsetY, 120 - offsetX, 120 - offsetY, Paints.BLUE); 

} 

Ve tuval kaydırmak için:

float x, y; 
@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if(ev.getAction() == MotionEvent.ACTION_DOWN){ 
     x = ev.getX(); 
     y = ev.getY(); 
    }else if (ev.getAction() == MotionEvent.ACTION_MOVE) { 
     float currX = ev.getX(); 
     float currY = ev.getY(); 

     float newOffsetX = (x - currX), 
       newOffsetY = (y - currY); 
     //The next two if-statements are to add sensitivity to the scrolling. 
     //You can drop these if you don't plan on having touch events 
     //with pressing. Pressing works without this as well, but the canvas may move slightly 
     //I use DP to handle different screen sizes but it can be replaced with pixels. c is a context-instance 
     if (newOffsetY < Maths.convertDpToPixel(2, c) && newOffsetY > -Maths.convertDpToPixel(2, c)) 
      newOffsetY = 0; 

     if (newOffsetX < Maths.convertDpToPixel(2, c) && newOffsetX > -Maths.convertDpToPixel(2, c)) 
      newOffsetX = 0; 
     offsetX += newOffsetX; 
     offsetY += newOffsetY; 
     x = ev.getX(); 
     y = ev.getY(); 
    } 

    return true; 

} 

Ve örnek bir kamera sınıf:

public class Camera{ 

    public static float offsetX, offsetY; 
    //The constructor. ix and iy is the initial offset. Useful if you are creating a game and need to change the initial offset to center around a starting position. 
    //Most of the time it will be enough to set the values to 0 
    public Camera(float ix, float iy){ 
     this.offsetX = ix; 
     this.offsetY = iy; 
    } 

}