Custom Relative Layout Skalierung?

Ich versuche, Custom RelativeLayout zu machen, die skalieren und scrollen können. Im Moment habe ich versucht, Skala zu erreichen. Jetzt habe ich das benutzerdefinierte Relative Layout als übergeordnetes Layout eines anderen relativen Layouts gemacht, das berührbare Imageview als sein Kind enthält. Nun, wenn ich das Elternteil benutzerdefinierte relative Layout zoom Zoom wird auch Zoom, aber der klickbare Bereich der Bildansicht übersetzt, ich weiß nicht warum? Wenn Imageview oder Layout in normaler Position sind, ist der anklickbare Bereich auf der Imageansicht, aber sobald das Layout zoom wird, verschiebt sich der klickbare Bereich? Ich weiß nicht, warum bin ich vor verrückter Position Verschiebung von clickable

Hier ist der code

Meine kundenspezifische verwandten

public class scaleLayout extends RelativeLayout { private float mScaleFactor=1.0f; private long lastTouchTime = -1; public scaleLayout(Context context) { super(context); // setWillNotDraw(false); } public scaleLayout(Context context, AttributeSet attrs) { super(context, attrs); //setWillNotDraw(false); // TODO Auto-generated constructor stub } /* @Override public boolean dispatchTouchEvent(MotionEvent event) { return super.dispatchTouchEvent(event); } */ @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { long thisTime = System.currentTimeMillis(); if (thisTime - lastTouchTime < 250) { // Double tap mScaleFactor=1.5f; invalidate(); lastTouchTime = -1; } else { // Too slow :) /* mScaleFactor=1.0f; invalidate();*/ lastTouchTime = thisTime; } } return super.onInterceptTouchEvent(ev); } @Override protected void dispatchDraw(Canvas canvas) { // TODO Auto-generated method stub canvas.save(Canvas.MATRIX_SAVE_FLAG); canvas.scale(mScaleFactor, mScaleFactor); super.dispatchDraw(canvas); canvas.restore(); } @Override public ViewParent invalidateChildInParent(int[] location, Rect dirty) { // TODO Auto-generated method stub return super.invalidateChildInParent(location, dirty); } protected void onLayout(boolean changed, int l, int t, int r, int b) { int count = getChildCount(); for(int i=0;i<count;i++){ View child = getChildAt(i); if(child.getVisibility()!=GONE){ RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)child.getLayoutParams(); child.layout( (int)(params.leftMargin * mScaleFactor), (int)(params.topMargin * mScaleFactor), (int)((params.leftMargin + child.getMeasuredWidth()) * mScaleFactor), (int)((params.topMargin + child.getMeasuredHeight()) * mScaleFactor) ); } } } 

Hier ist die Aktivität

 public class LayoutZoomingActivity extends Activity implements OnTouchListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView img1 = (ImageView) findViewById(R.id.imageView1); img1.setOnTouchListener(this); ImageView img2 = (ImageView) findViewById(R.id.imageView2); img2.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub ImageView iv= (ImageView) v; v.setVisibility(View.INVISIBLE); return false; } 

Das ist xml

 <com.layoutzooming.scaleLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/gm01" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="jhkibnkij" android:layout_centerInParent="true" android:textColor="#FFFFFF" android:textSize="25dp" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_marginLeft="500dp" android:layout_marginTop="250dp" android:background="#000" android:src="@drawable/dih01" /> <ImageView android:id="@+id/imageView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_marginLeft="350dp" android:layout_marginTop="250dp" android:background="#000" android:src="@drawable/dih02" /> </RelativeLayout> </com.layoutzooming.scaleLayout> 

2 Solutions collect form web for “Custom Relative Layout Skalierung?”

Einige, wie ich es geschafft, dieses Problem zu beheben, indem Sie den folgenden Code in LayoutZoomingActivity .

  public class LayoutZoomingActivity extends Activity implements OnTouchListener { ImageView img1; ImageView img2; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); img1 = (ImageView) findViewById(R.id.imageView1); img1.setOnTouchListener(this); img2 = (ImageView) findViewById(R.id.imageView2); img2.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub Log.d("b","b"); if(isViewContains(img1, (int)event.getX(), (int)event.getY())) { img1.setVisibility(View.GONE); } if(isViewContains(img2, (int)event.getX(), (int)event.getY())) { img2.setVisibility(View.GONE); } return false; } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub Log.d("onTouchEvent c","c"+(int)event.getX()+","+(int)event.getY()); if(isViewContains(img1, (int)event.getX(), (int)event.getY())) { img1.setVisibility(View.GONE); img1.invalidate(); } if(isViewContains(img2, (int)(event.getX()/scaleLayout.mScaleFactor), (int)(event.getY()/scaleLayout.mScaleFactor))) { img2.setVisibility(View.GONE); img2.invalidate(); } return super.onTouchEvent(event); } private boolean isViewContains(View view, int rx, int ry) { int[] l = new int[2]; view.getLocationOnScreen(l); int x = l[0]; int y = l[1]; int w = view.getWidth(); int h = view.getHeight(); Log.d("isViewContains::"+x+"::"+y+"::"+w+"::"+h,rx+"::"+ry); if (rx < x || rx > x + w || ry < y || ry > y + h) { return false; } return true; } } 

Können Sie bitte dies ausprobieren und nach Ihren Anforderungen anpassen.

Die tatsächlichen sind vom übergeordneten Layout (skalierbares relatives Layout) erhöht, so dass dieses relative Layout und die Bildansicht beide versuchen, sich an die gleiche Position anzupassen, wie es vor dem Anstieg war. Vor der Skalierung hatten sie eine Position relativ zum Bildschirm und nun nach dem Scalling Sie versuchen, sich an die gleiche Position anzupassen. Verwenden Sie lineares Layout für das Scalling

  • Wie bekomme ich einen Blick nach vorne ohne Aufruf bringToFront ()?
  • Erstellen einer Kopie einer Ansicht?
  • Hinzufügen von Ansichten zu einer Android Viewgroup Programmatically
  • Android machen benutzerdefinierte Layout Form
  • Scrollen Sie die Bar zur benutzerdefinierten ViewGroup
  • Fixes Seitenverhältnis Ansicht
  • Ansichten innerhalb einer benutzerdefinierten ViewGroup nicht Rendering nach einer Größenänderung
  • Unterschied zwischen Ansicht und ViewGroup in Android
  • Neun Patch auf einer benutzerdefinierten Viewgroup
  • Android auf Sicht aus dem Elternteil entfernt
  • So erhalten Sie den Index der bestimmten (benutzerdefinierten) Ansicht von ViewGroup (FrameLayout), nachdem Sie onLongClick auf der Ansicht getan haben
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.