在没有ScrollView的情况下分析和处理Imageview中的滚动手势(使用画布)

时间:2014-11-29 15:02:49

标签: android scroll scrollview scroller

我已经尝试了很多东西来处理我的问题,但它并没有真正起作用,谷歌也无法帮助我。 我有一个包含画布的ImageView。画布绘制图形的一部分。因此,当用户滚动(水平)时,画布应该绘制图形的另一部分。例如:

画布宽度为200px

画布将图形从x = 0绘制到x = 200

用户滚动(水平),他的手指超过100px

画布现在应该从x = 100到x = 300

绘制图形

画布应该按用户滚动的每个像素重绘(以便平滑滚动) 此解决方案不起作用: 绘制整个图形并将其放在Scrollview中。这会导致OutOfMemoryError,因为画布/位图太大了。

此外,我还需要做一些其他的事情,所以我需要像上面描述的那样做。

以下是代码:

XML:

<de.touristenfahrerforum.Marcel.Fragments.SpeedGraph
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:id="@+id/graph"
    android:background="@android:color/black"
    android:name="de.touristenfahrerforum.MarcelMoiser.Fragments.SpeedGraph">
</de.touristenfahrerforum.Marcel.Fragments.SpeedGraph>

Java类:

public class SpeedGraph extends ImageView
{
...
public SpeedGraph(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public SpeedGraph(Context context, AttributeSet attrs) {
    super(context, attrs);
}

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

public void setup( ArrayList<Location> locations, ScrollViewListener scrollViewListener )
{ 
...
    Bitmap bitmap = Bitmap.createBitmap(speedCanvasWidth,speedCanvasHeight,Bitmap.Config.ARGB_8888);
    canvas        = new Canvas(bitmap);
    this.setImageBitmap(bitmap);
...}
...
private void drawGraph(int start, int end, int color)
{
    graphPaint.setColor(color);

    long startTime = locations.get(start).getTime();

    Path path = new Path();
    path.moveTo((locations.get(start).getTime()-startTime)/10*V.LOGICAL_DENSITY, speedCanvasHeight-(int)(locations.get(start).getSpeed()*3.6*SIZE_FACTOR));

    for( int it = start; it < end; it++ )
    {
        Location location = locations.get(it);
        path.lineTo((location.getTime()-startTime)/10*V.LOGICAL_DENSITY, speedCanvasHeight-(int)(location.getSpeed()*3.6*SIZE_FACTOR));
    }

    canvas.drawPath(path,graphPaint);
}
...

所以我想实现识别水平滚动手势的东西,并给我一些像素,向我显示用户滚动的像素。

提前谢谢你们

1 个答案:

答案 0 :(得分:0)

这是第一次没有人回答,但我想出了如何解决我的问题。 最好的方法是实现GestureDetector.OnGestureListener并覆盖它的所有方法。您还必须创建一个GestureDetector对象。 OnScroll(...)方法是查找用户滚动的像素的位置。 这是一些代码:

public class SpeedGraph extends ImageView implements GestureDetector.OnGestureListener
{
    private Context context;
...
public void setup( ... )
{
    this.gestureDetector = new GestureDetector(context, this);
    gestureDetector.setIsLongpressEnabled(false);
...}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
    scrolled+=distanceX;
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
    drawGrid();
    redrawGraphsInCanvas();
    this.invalidate();
    return true;
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev){
    gestureDetector.onTouchEvent(ev);
    return true;
}

...