2016-06-24 7 views
-2

Um eine Schaltfläche in der genauen Stelle auf allen Geräten zu positionieren, habe ich es mit einer benutzerdefinierten Ansicht erstellt. Die Schaltfläche nimmt einen kleinen Teil des Bildschirms ein, aber die eigentliche Ansicht nimmt den größten Teil des Bildschirms ein. Der gesamte Bereich um den Button ist transparent. Wie kann ich dem Benutzer erlauben, durch den transparenten Bereich auf die darunter liegenden Schaltflächen zu klicken, aber trotzdem auf den Schaltflächenbereich in der Ansicht zu klicken? HierAndroid - Wie man durch den transparenten Bereich der benutzerdefinierten Ansicht klickt

ist der relavant Code:

public class MainActivity extends AppCompatActivity { 

final float dotScale = 0.3f; 
Dot dot1, dot2; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

RelativeLayout myLayout = (RelativeLayout) findViewById(R.id.mainView); 
MyView myView = new MyView(this); 
myLayout.addView(myView); 

// Two dots are created. 

dot1 = new Dot(this); 
dot1.xOffset = 2.9f; 
dot1.yOffset = 3.3f; 
myLayout.addView(dot1); 
dot2 = new Dot(this); 
dot2.xOffset = -2.4f; 
dot2.yOffset = 1.1f; 
myLayout.addView(dot2); 

// Makes dots clickable 

dot1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (!dot1.isClicked) { 
      dot1.animate().setDuration(300).setInterpolator(new AnticipateInterpolator()) 
        .scaleXBy(dotScale).scaleYBy(dotScale).alpha(1.0f); 
      dot1.isClicked = true; 
     } 
    } 
}); 

dot2.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (!dot2.isClicked) { 
      dot2.animate().setDuration(300).setInterpolator(new AnticipateInterpolator()) 
        .scaleXBy(dotScale).scaleYBy(dotScale).alpha(1.0f); 
      dot2.isClicked = true; 
     } 
    } 
}); 

} 

....... 

//custom view for Dots 

class Dot extends View { 

int radius; 
float xOffset; 
float yOffset; 
boolean isClicked = false; 

public Dot(Context context) { 
    super(context); 
    setClickable(true); 


} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    int x = getWidth(); 
    int y = getHeight(); 
    double ratio = (547d/828d); 
    float circleX = (float)((x/2) - (y * ratio)/xOffset); 
    float circleY = (float)(y/yOffset); 

    radius = (int)((float)y/13); 
    setPivotX(circleX); 
    setPivotY(circleY); 

    Paint paint = new Paint(); 
    paint.setColor(Color.RED); 
    canvas.drawCircle(circleX, circleY, radius, paint); 
} 


} 
+0

Bitte bereichern Sie Ihre Frage mit etwas Code, es ist kaum möglich, Ihnen eine genaue Antwort zu geben –

+0

Code zur Frage hinzugefügt. –

Antwort

0

Sie Ihre Ansicht verwenden sollten clickable und nicht außer Kraft onTouch überhaupt nicht oder nur zurückgeben false von ihm. Return false bedeutet, dass Sie das Ereignis nicht konsumiert haben und es an das nächste Element in der Ansichtshierarchie weitergeleitet wird.

+0

Ich habe onTouch versucht. Ich glaube jedoch nicht, dass meine Ansichten hierarchisch sind, so dass die darunter liegende Ansicht nicht angeklickt wird. –

+0

@BeauCarnes, ist Ihre Ansicht mit der Taste ('MyView?') Übereinstimmenden Elternteil für einen bestimmten Zweck? Wenn nicht, füge View mit 'myLayout.addView (myView, neue LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)) hinzu;'. Es wird 'wrap_content' festgelegt und die Ansicht wird die Größe des Inhalts sein –