【问题标题】:How get custom view id in android如何在android中获取自定义视图ID
【发布时间】:2013-07-13 01:14:11
【问题描述】:

我按照link 来设计我的钢琴应用程序。我能够为钢琴设计节点。现在我无法识别用户触摸哪个节点,以便我可以播放特定节点。

我的自定义钢琴键代码是:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

class Piano extends View {
    public Piano(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    Bitmap whiteKey, blackKey;
    Paint paint = new Paint();

    public void draw(Canvas canvas) {
        if (whiteKey == null) {
            whiteKey = BitmapFactory.decodeResource(getResources(), R.drawable.white_up);
        }
        if (blackKey == null) {
            blackKey = BitmapFactory.decodeResource(getResources(), R.drawable.black_up);
        }

        int keys = 10;

        // draw white keys
        for (int i = 0; i < keys; i++) {
            canvas.drawBitmap(whiteKey, i * whiteKey.getWidth(), 0, paint);
        }
        // draw black keys
        for (int i = 0; i < keys; i++) {
            if (i != 3 && i != 7) {
                canvas.drawBitmap(blackKey, i * blackKey.getWidth()+blackKey.getWidth()*0.5f, 0, paint);
            }
        }
    }
}

在 Activity 中,我正在调用 setContentView 这样的方法。

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Piano piano = new Piano(this);
        setContentView(piano);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

我如何获得位图的 id 以便我可以播放节点。

【问题讨论】:

  • 你能详细说明你的问题吗?发布导致问题的代码,到目前为止您尝试过什么?

标签: android android-custom-view


【解决方案1】:

你必须得到用户触摸的位置,查看this post 和here is 如何设置onTouchListener。 当您有 x,y 位置时,您必须测试按下了哪个键。

尝试首先为所有黑键运行 for 循环,因为它们与白键重叠。 如果您没有找到任何按下的黑键,则遍历所有白键。 白键的循环看起来像这样:

boolean keyfound=false;
int pressedkey=-1;
for (int i = 0; i < keys; i++) {
    if( (x>=(i*whiteKey.getWidth())) && (x<((i+1)*whiteKey.getWidth()))
        && (y>0) && (y<whiteKey.getHeight()) )
    {
         pressedkey=i;
         keyfound=true;
         break;
    }
}

【讨论】:

    【解决方案2】:

    为Canvas 设置setOnTouchListener。 OnTouchListener 实现了一个如下所示的函数:onTouch(View v, MotionEvent event)。其中的MotionEvent 以getX() 和getY() 的形式提供有关触摸实际发生位置的信息。使用数据找到被点击的按钮。我认为这应该可以解决问题。

    x=event.getX();
    y=event.getY();
    let whitewidth and blackwidth be the width of these keys and similarly whiteheight and    blackheight.
    for (int i = 0; i < num_of_keys; i++) {
        if( (x>(i*whitewidth)) && (x<((i+1)*whitewidth))
            && (y>0) && (y<whiteheight) )
        {
             pressedkey=i;
        }
    }
    

    使用按键的 id 可以播放特定的 mp3 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多