安卓画布滚动

Posted

技术标签:

【中文标题】安卓画布滚动【英文标题】:android canvas scroll 【发布时间】:2010-10-27 01:25:08 【问题描述】:

我正在编写一个纸牌游戏应用程序。我使用画布在屏幕上绘制所有内容。有时一堆卡片会变大并延伸到屏幕底部以下。我想让画布可滚动,以便用户可以访问这些卡片。

主要活动

package com.maulinpathare.solitaire;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class Solitaire extends Activity
    /** Called when the activity is first created. */
     private Context mContext;
     private GameView mG;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.main);
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        boolean result = super.onCreateOptionsMenu(menu);
        menu.add(0, 1, 0, R.string.newGame);
        menu.add(0, 2, 0, R.string.exitGame);
        return result;
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        switch (item.getItemId()) 
        case 1:
          mG = new GameView(this);
          setContentView(mG);
            return true;
        case 2:
            finish();
            return true;
        
        return false;
    

//end class 

GameView 类 这就是一切发生的地方 我已经删除了大部分游戏逻辑...

package com.maulinpathare.solitaire;

import java.util.Stack;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ScrollView;

public class GameView extends ScrollView implements OnTouchListener
     private Deck mD;
     private boolean mInit, mDone;
     private Stack<Card> mPile1, mPile2, mPile3, mPile4, mPile5, mPile6, mPile7,
                              mOpenPile, mEndPile1, mEndPile2, mEndPile3, mEndPile4, mTemp;
     private Canvas mCanvas;
     private int mPile;
     private boolean mPickUp, mVictory;
     private Card mCard;
     private final int mSpacing = 22;
     private Paint rectPaint, wonPaint1, wonPaint2;

     public GameView(Context context) 
        super(context);
                    //initialize everything needed for the game
    

    @Override
    protected void onDraw(Canvas canvas) 
     mCanvas = canvas;
     if(mInit)
          initialize();
          mInit = false;
     
        //draw stuff...

    //end onDraw

    public boolean onTouch(View v, MotionEvent event)
     int eventAction = event.getAction();
     int x = Math.round(event.getX());
     int y = Math.round(event.getY());

     switch(eventAction)
     case MotionEvent.ACTION_DOWN:
                    //check if touch has happened on one of the card piles
          break; //end case action_touch

     case MotionEvent.ACTION_MOVE:
                    //if card touched move it
          break; //end case action_move

     case MotionEvent.ACTION_UP:
                    //check if legal move has been made
          break; //end case action_up

     //end switch(event)

     invalidate();
     return true;
    //end onTouch

我应该在哪里以及如何实现屏幕滚动?我希望用户能够以他们想要滚动的方向在屏幕上滑动手指。

【问题讨论】:

这篇文章***.com/questions/2646028/…有一个覆盖onInterceptTouchEvent方法的例子。 【参考方案1】:

参见 android.widget.Scroller 和 android.view.VelocityTracker。它们将让您实现自定义滚动视图。 此外,您可以将 Canvas 放入 ScrollView...

【讨论】:

是的,另一个论坛上的某个人也告诉我这样做。我现在已将我的 GameView 作为孩子添加到 ScrollView。滚动现在工作正常,但因为 ScrollView 吃掉了所有的触摸事件,与卡片的交互现在被破坏了。我试图弄清楚是否有某种方法可以让 ScrollView 只接受某些事件并将其余的传递给它的孩子。【参考方案2】:

有趣的东西,我理解视图在 Android 中工作的方式是内部视图接收所有触摸事件,并且只有在内部视图的 onTouchEvent 返回 0 时,事件才会传递给包装视图(也就是说他们没有处理它)除非父视图拦截触摸事件。

我认为你需要覆盖 onInterceptTouchEvent;

ScrollView

您希望在比当前更多的情况下将被拦截的事件传递给子视图。

我发现查看源代码通常很有用,因为文档可能不完整。

抱歉,我无法提供更多帮助,希望您可以通过扩展视图找到答案。

Gav

【讨论】:

以上是关于安卓画布滚动的主要内容,如果未能解决你的问题,请参考以下文章

像 Snapseed 安卓应用一样的画布捏缩放

安卓画布drawText

安卓自定义View进阶-Canvas之画布操作

用画布canvas画安卓logo

安卓中遮罩图片的处理

安卓复习9