我已经尝试了很多东西来处理我的问题,但它并没有真正起作用,谷歌也无法帮助我。 我有一个包含画布的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);
}
...
所以我想实现识别水平滚动手势的东西,并给我一些像素,向我显示用户滚动的像素。
提前谢谢你们
答案 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;
}
...