0

まず、アプリhttp://www.jjoe64.com/p/graphview-library.htmlでこのライブラリを使用してグラフを作成しています。次に、このコード (コメントで見つけたもの) を使用して、タッチ イベントの x 位置を取得します。

//intercepts touch events on the graphview
@Override
public boolean dispatchTouchEvent(MotionEvent event) { 
    switch (event.getAction()) {
        //when you touch the screen
        case MotionEvent.ACTION_DOWN:
            // gets the location of the touch on the graphview
            float x = event.getX(event.getActionIndex());
            // gets the boundries of what you are viewing from the function you just added
//  vp is set to vp[0] = 0 & vp[1] = numDaysOil, numDaysOil could be anywhere from 2 to 30 
            double[] vp = graphOilView.getViewPort();
            // gets the width of the graphview
            int width = graphOilView.getWidth();
             //gets the x-Value of the graph where you touched
            @SuppressWarnings("unused")
            double xValue = vp[0] + (x / width) * vp[1];
// trying a different ways to get different x vaules 
            double xVal = (x / width) * numDaysOil;
            //add a method to lookup a value and do anything you want based on xValue. 

            break;
        } // end switch
    return super.dispatchTouchEvent(event);
} // end dispatchTouch Event

どこに触れるか (またはエミュレーターをクリックするか) に応じて、正しい x 値が得られますが、x 値が小さすぎたり大きすぎたりすることがあります。

誰でもこれについて何か洞察がありますか?

編集: グラフ内の場所をクリックすると、xValue が正しい x 値を返す場合と、y 値に対応する x 値よりも小さいまたは大きい xValue を返す場合があります。例 グラフ上のポイントを作成するために使用される x 値は 12 で y 値は 30 ですが、上記のコードで計算された xValue は 9 を返す可能性があります。そのため、x = 9 を検索しようとすると、間違った y 値が取得されます。グラフ化されているデータ: x: 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15 y: 5、16、8、11、1、30、20 、11、18、29、27、30、8、10、19

4

1 に答える 1

0

私はこのようにそれを解決しました:

graphView = new LineGraphView(context,"Title");
graphView = initGraphView(graphView);    
graphView.setOnTouchListener(new OnTouchListener(){
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_DOWN) {
                        int size = series1.size();
                        float screenX = event.getX();
                        float screenY = event.getY();
                        float width_x = v.getWidth();
                        float viewX = screenX - v.getLeft();
                        float viewY = screenY - v.getTop();
                        float percent_x = (viewX/width_x);
                        int pos = (int) (size*percent_x);

                        System.out.println("X: " + viewX + " Y: " + viewY +" Percent = " +percent_x);
                        System.out.println("YVal = " +series1.getY(pos));
                        tvNum.setText(series1.getY(pos)+"");
                        return true;
                    }
                    return false;
                }

            });

これはあなたとほぼ同じように見えますが、ビューから数値を取得したいときはいつでもgraphView.setScrollable(false)andを設定することを忘れないでください. graphView.setScalable(false)これはパッケージの奇妙な癖だと思います。シリーズからx値とy値を取得するために、データ収集を停止してグラフを「フリーズ」する必要がありました。

誰かがより良い方法を知っていますか?

于 2014-05-01T08:24:49.140 に答える