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 beleben Sie eine Veränderung in einer Auflage?
  • Android StackOverflowError in ViewGroup.resetResolvedTextDirection
  • NullPointerException: Versuchen Sie, aus dem Feld 'int android.view.View.mViewFlags' zu lesen.
  • Android View.bringToFront () verursacht Flimmern
  • Ausgeben in einer benutzerdefinierten ViewGroup beim Auffrischen von ListViews
  • So erstellen Sie benutzerdefinierte Viewgroup in Android mit Beispiel
  • Wie handle ich mit Klick in die untergeordneten Ansichten und berühre die übergeordneten ViewGroups?
  • Scrollen Sie die Bar zur benutzerdefinierten ViewGroup
  • Erstellen einer Kopie einer Ansicht?
  • Activity.addContentView (Ansicht) == ViewGroup.addContentView (Ansicht)?
  • Setzen Sie GestureDetector auf alle Kinderansichten
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.