Click auf überlappende View wird nur von View darunter registriert

  • Antworten:3
  • Bentwortet
Wassim Ben H.
  • Forum-Beiträge: 3

01.06.2012, 16:39:29 via Website

Hallo,

an sich wollte ich lediglich die SlidingDrawer Funktionalität dahingehend nachbauen, dass sie von links nach rechts aufgeht.
Standardmäßig klappt das ja nur von rechts nach links und von unten nach oben.
Wie dem auch sei - an sich hab ich das optisch hinbekommen:

1<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="fill_parent"
3 android:layout_height="fill_parent"
4 android:background="@drawable/login_bg"
5 android:id="@+id/vg" >
6
7 <EditText
8 android:layout_width="fill_parent"
9 android:layout_height="wrap_content"
10 android:text="@string/hello" android:textColor="#000000" />
11
12 <LinearLayout
13 android:id="@+id/panel"
14 android:layout_width="200dp"
15 android:layout_height="fill_parent"
16 android:orientation="horizontal" >
17 <LinearLayout
18 android:layout_height="fill_parent"
19 android:layout_width="290dp"
20 android:background="@drawable/slider_bg">
21
22 <Button
23 android:id="@+id/big_btn"
24 android:text="Test"
25 android:layout_width="60dp"
26 android:layout_height="30dp" />
27
28 </LinearLayout>
29 <LinearLayout
30 android:layout_height="fill_parent"
31 android:layout_width="30dp"
32 android:background="@android:color/transparent">
33
34 <ImageView
35 android:id="@+id/img"
36 android:layout_width="wrap_content"
37 android:layout_height="wrap_content"
38 android:src="@drawable/slider_tab"
39 android:layout_gravity="bottom"
40 android:paddingBottom="20dp" />
41 </LinearLayout>
42 </LinearLayout>
43</RelativeLayout>

Hier noch ein Auszug aus der Java Datei:

1public void onCreate(Bundle savedInstanceState)
2{
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.main);
5
6 sp = (ViewGroup)findViewById(R.id.panel);
7
8 splp = new RelativeLayout.LayoutParams(
9 new ViewGroup.MarginLayoutParams(
10 RelativeLayout.LayoutParams.WRAP_CONTENT,
11 RelativeLayout.LayoutParams.FILL_PARENT));
12
13 splp.setMargins(-435, 0, 0, 0);
14 sp.setLayoutParams(splp);
15
16 sp.requestFocus();
17
18 moveLeftToRight = new TranslateAnimation(0, 435, 0, 0);
19 moveLeftToRight.setDuration(1000);
20 moveLeftToRight.setFillAfter(true);
21 moveLeftToRight.setAnimationListener(this);
22 moveLeftToRight.initialize(40, 119, 480, 762);
23
24 moveRightToLeft = new TranslateAnimation(435, 0, 0, 0);
25 moveRightToLeft.setDuration(1000);
26 moveRightToLeft.setFillAfter(true);
27 moveRightToLeft.setAnimationListener(this);
28
29 img = (ImageView)findViewById(R.id.img);
30 //Now add the touchListener on the ContainerGroup
31 ViewGroup vg = (ViewGroup)findViewById(R.id.vg);
32 vg.bringToFront();
33 vg.setOnTouchListener(new View.OnTouchListener()
34 {
35 @Override
36 public boolean onTouch(View v, MotionEvent event)
37 {
38 int imgX = img.getLeft();
39 int imgY = img.getTop()-50;
40
41 int xOffset = 400;
42 int imgXEnd = img.getLeft() + xOffset;
43
44
45 int imgW = img.getWidth();
46 int imgH = img.getHeight();
47
48 int imgXW = imgX + imgW;
49 int imgYH = imgY + imgH;
50
51 int x = (int)event.getX() - offset_x;
52 int y = (int)event.getY() - offset_y;
53
54 switch(event.getActionMasked())
55 {
56 case MotionEvent.ACTION_DOWN:
57
58 Log.i("Touch X", x + "");
59 Log.i("Touch Y", y + "");
60 Log.i("IMG POSITION X", imgX + "");
61 Log.i("IMG POSITION Y", imgY + "");
62 Log.i("IMG WIDTH", imgW + "");
63 Log.i("IMG HEIGHT", imgH + "");
64 Log.i("LEFT POS", "" );
65
66 img.getLayoutParams();
67
68 if(!animating)
69 {
70 if(!sliderIsOpen && (x>=imgX) && (x<=imgXW) && (y>=imgY) && (y<=imgYH))
71 {
72 animating = true;
73 sp.startAnimation(moveLeftToRight);
74 sliderIsOpen = true;
75 //startDragging = true;
76 }
77 else if(sliderIsOpen && (x>=imgXEnd) && (x<=imgXEnd + imgW) && (y>=imgY) && (y<=imgYH))
78 {
79 animating = true;
80 sp.startAnimation(moveRightToLeft);
81 sliderIsOpen = false;
82 }
83 else
84 {
85 startDragging = false;
86 }
87 }
88 break;
89 case MotionEvent.ACTION_UP:
90 if(startDragging)
91 {
92 startDragging = false;
93 }
94 default:
95 break;
96 }
97 return true;
98 }
99});
Von der Idee her lasse ich also die View mit dem größten Z Index in onCreate nach links verschieben, und bei Bedarf wird sie über die untere View nach rechts geschoben. Das klappt soweit auch recht gut. Nur wenn ich den Button auf der obersten View drücke, dann geht der Fokus durch die View auf den EditText der View darunter. Kann mir jemand einen Tipp geben wie - bei ausgeklappter View - nur Komponenten darin reagieren, und nicht die Komponenten der View darunter?
By the way - ich habe die Formatierung des Quelltextes nicht sauber einfügen können wie Ihr seht. Wusste echt nicht wie es besser geht. Ansonsten lade ich Quelltext in Zukunft

Viele Grüße!

Antworten
Wassim Ben H.
  • Forum-Beiträge: 3

01.06.2012, 17:17:00 via Website

Kleiner Zwischenstand - ich habs grad mit einem FrameLayout probiert, und sie da - es klappt es halbwegs.
Nun kann ich auch den Button betätigen. Leider kann ich so noch immer auf die EditText Komponente drücken.
Ich kann zwar nun nicht mehr mittels setMargins den startOffset auf einen negativen Wert setzen, über eine kleine Animation klappt das:

1initPos = new TranslateAnimation(0, -435, 0, 0);
2initPos.setDuration(0);
3initPos.setFillAfter(true);
4sp.startAnimation(initPos);

Komisch eigentlich. Über die Animation kann ich den X Wert von sp setzen.
Mich wundert warum es keine Funktion a la sp.setX(int x) gibt. Vielleicht hab ich da aber auch nur was übersehen.

Viele Grüße

— geändert am 01.06.2012, 17:20:18

Antworten
Wassim Ben H.
  • Forum-Beiträge: 3

04.06.2012, 12:11:14 via Website

Super,

vielen vielen Dank!

Antworten