【问题标题】:Acivate view with moving finger用移动手指激活视图
【发布时间】:2013-03-01 11:27:16
【问题描述】:

我正在尝试创建一个填充有矩形的字段,如果您移动手指,其下方的矩形会改变颜色。我已经尝试了很多方法,但我没有成功,我没有任何其他想法。现在我的代码看起来像这样,问题是着色(在 ontouch 中)只有当我的手指在屏幕的左上角时才会激活并且它会为所有矩形着色。

public class MainActivity extends Activity implements OnTouchListener {
ImageView[][] buttons;
Button b;
TableLayout ButtonContainer; 
RelativeLayout linar;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    buttons=new ImageView[5][5];
    linar=new RelativeLayout(this);
    linar.setOnTouchListener(this);

    setPos(0,0,100);
    setContentView(linar);
}

void setPos(float startX, float startY, int size)
{
    float actposX,actposY;
    actposX=startX;
    actposY=startY;
    for (int i=0;i<5;i++){

        for (int j=0;j<5;j++){
            buttons[i][j]=new ImageView(this);
            buttons[i][j].setLayoutParams(new RelativeLayout.LayoutParams(size, size));
            buttons[i][j].setX(actposX);
            buttons[i][j].setY(actposY);
            if (j % 2 ==0){
                buttons[i][j].setBackgroundColor(Color.YELLOW);
            }
            else
            {   buttons[i][j].setBackgroundColor(Color.BLUE);   }
            actposX+=size;
            linar.addView(buttons[i][j]);
        }
        actposY+=size;
        actposX=startX;
    }

}

@Override
public boolean onTouch(View v, MotionEvent event) {

    for(int i =0; i< 5; i++)
        {
           for (int j=0; j< 5; j++)
           {
               Rect outRect = new Rect(buttons[i][j].getLeft(), buttons[i][j].getTop(), buttons[i][j].getRight(), buttons[i][j].getBottom());
               if(outRect.contains((int)event.getX(), (int)event.getY()))
                {
                    buttons[i][j].setBackgroundColor(Color.RED);
                }
           }
        }

    return true;
}

}

【问题讨论】:

  • 在你的 onTouch 监听器中使用 MotionEvent.ACTION_MOVE,捕捉矩形并尝试填充它..
  • 我不想分离运动事件,我不知道如何捕捉它们,你能给我写个例子吗?

标签: android view


【解决方案1】:

你可以这样做,

     @Override
                public boolean onTouchEvent(MotionEvent event) {
                    // TODO Auto-generated method stub
                    final int action = event.getAction();

                    switch (action & MotionEventCompat.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        event.getX();
event.getY();

                        Log.d(TAG, "onTouchEvent DOWN: x " + selX + ", y " + selY);
                        break;

                    case MotionEvent.ACTION_MOVE:
                        event.getX();
                                event.getY();
                        Log.d(TAG, "onTouchEvent Move: x " + selX + ", y " + selY);
                        break;

                    case MotionEvent.ACTION_UP:
                        event.getX();
                                event.getY();
                        Log.d(TAG, "onTouchEvent UP: x " + selX + ", y " + selY);

                        break;
                    }

                    return true;
                }

MotionEvent.ACTION_MOVE 将检测指针移动。您可以获得指针并进行颜色填充部分。还要检查 logcat 以获得更好的理解。祝你好运!

【讨论】:

  • 我可能错了,但是......是的,这将运动事件分开为触摸、移动和释放,但我不在乎哪些运动事件激活它我最大的问题是我不知道在 select (int,int) 中写什么,因为如果我写我的 select 方法,这是循环的 2,我就在我开始的地方
  • 您可以在 ACTION_MOVE 的情况下使用您的代码。 getX() 和 getY() 将获取 X 和 Y 坐标,您可以在它们的帮助下进行绘制。
  • 我也可以通过 event.getX() 获取坐标,并且不需要拆分移动案例来获取坐标。所以我的手指有坐标,但我无法确定我正在触摸的女巫矩形(ImageView)
  • 你的矩形是怎么画的??它是在 xml 文件中还是您通过逻辑创建它.. 如果您在逻辑上创建它,您也可以在触摸事件中获取它,
  • 矩形基本上是 ImageView-s,我在 setPos() 过程中将它们彼此相邻放置,但如果我在它们上设置触摸监听器.. 它只感知触摸而不是运动
【解决方案2】:

我想通了... getLeft(), getTop().. 会返回 0 值,所以我用这个改变了它:

                   outRect.top=(int) (buttons[i][j].getY());
               outRect.bottom=(int) (buttons[i][j].getY()+buttons[i][j].getLayoutParams().height);
               outRect.left=(int) (buttons[i][j].getX());
               outRect.right=(int) (buttons[i][j].getX()+buttons[i][j].getLayoutParams().height);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2013-08-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多