2017-11-11 3 views
11

虹のようなカスタムアークビューを作成しています。円弧ビューを描画することはできますが、ビューごとに個別のクリックイベントを作成することはできません。アークビューごとに個別のクリックイベントを設定するにはどうすればよいですか。前もって感謝します。ここで カスタムアークビューを描画し、各アークのユーザークリックを検出します。

コードです:

ArcView.java

public class ArcView extends View implements View.OnTouchListener{ 

    Paint paint; 

    int radius, x, y; 
    int color; 

    public ArcView(Context context) { 
     super(context); 
     init(); 
    } 

    public ArcView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public ArcView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public ArcView(Context context, int radius, int x, int y, int color) { 
     super(context); 

     this.radius = radius; 
     this.x = x; 
     this.y = y; 
     this.color = color; 
     init(); 
    } 

    private void init(){ 
     paint = new Paint(); 
     paint.setColor(color); 
     paint.setStrokeWidth(10); 
     paint.setStyle(Paint.Style.STROKE); 
     setOnTouchListener(this); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     paint.setStyle(Paint.Style.FILL); 
     canvas.drawCircle(x, y, radius, paint); 
    } 

    @Override 
    public boolean onTouch(View view, MotionEvent event) { 
     return false; 
    } 
} 

MainActivity.java

public class MainActivity extends AppCompatActivity { 
    RelativeLayout arcButton; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     arcButton = (RelativeLayout) findViewById(R.id.arcButton); 
     arcButton1 = (RelativeLayout) findViewById(R.id.arcButton1); 
     arcButton2 = (RelativeLayout) findViewById(R.id.arcButton2); 

     DisplayMetrics dm = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 
     int width=dm.widthPixels; 
     int height=dm.heightPixels; 

     int arcRadius1 = (int)(width/1.5); 
     int arcRadius2 = arcRadius1+(int)(width/3.5); 
     int arcRadius3 = arcRadius2+(int)(width/3.5); 

     int xCoor = width/2; 
     int yCoor = height; 

     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height); 

     arcButton.setLayoutParams(params); 
     View arcView1=new ArcView(this, arcRadius3, xCoor, yCoor, Color.RED); 
     View arcView2=new ArcView(this, arcRadius2, xCoor, yCoor, Color.BLACK); 
     View arcView3=new ArcView(this, arcRadius1, xCoor, yCoor, Color.BLUE); 
     arcButton.addView(arcView1); 
     arcButton1.addView(arcView2); 
     arcButton2.addView(arcView3); 

    } 
} 

出力:

Output screen

円弧ボタンごとに個別のクリックイベントを作成するにはどうすればよいですか?

+1

あなたはそれを行うことはできません - あなたの迅速な応答をpskink感謝@独自クリックリスナー – pskink

+0

各1 - 代わりに、いくつかの「リング」を持っている1つのカスタム 'View'を作ります。私はこれを試してみる。 – VigneshK

+0

私は3つのリングを別々に作成しようとし、各クリックリスナーを作成しましたが、最後のビューのクリックイベントが発生します。 – VigneshK

答えて

9

回避策は少しありますが、機能します。 ArcView内でこれを置く:Toastのために働くことを

@Override 
public boolean performClick() { 
    return super.performClick(); 
} 

@Override 
public boolean onTouch(View view, MotionEvent event) { 
    view.performClick(); 
    if (isPointInCircle((int) event.getX(), (int) event.getY())) { 
     // do what you want to do and get rid of the next two lines 
     String color = (((ArcView) view).color == Color.RED) ? "RED" : (((ArcView) view).color == Color.BLACK) ? "BLACK" : "BLUE"; 
     Toast.makeText(context, color, Toast.LENGTH_SHORT).show(); 
     return true; 
    } 
    return false; 
} 

private boolean isPointInCircle(int clickX, int clickY) { 
    return (clickX - x) * (clickX - x) + (clickY - y) * (clickY - y) <= radius * radius; 
} 

は注意、あなたはcontextをグローバルにする必要がありますが、最も可能性が高いとにかくToastを取り除くことになるでしょう。

enter image description here

関連する問題