2017-07-22 54 views
0

我有一個以屏幕爲中心的LinearLayout。它的寬度小於屏幕寬度。有兩個按鈕:右箭頭和左箭頭。 當用戶按下相關按鈕時,佈局應從相關側增加其寬度。另一方應該保持在那裏。從右側或左側增加LinearLayout寬度

現在設置寬度從兩側同樣增加布局。佈局需要首先居中,並且必須通過用戶的輸入從任一側擴展。 (用例是爲了找到左右邊界不相等的圖像的相關部分的寬度,所以用戶必須使用我的技術來標記它們)。

我正在使用以下來增加寬度,但它具有上述行爲。 PS:該功能自Tasker應用早期開始實施;所以這是可能的。編輯: 這是佈局。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <ImageView 
      android:gravity="top" 
      android:layout_gravity="top" 
      android:id="@+id/iv" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:visibility="visible" /> 

     <LinearLayout 
      android:id="@+id/llRightLeft" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center"> 

      <Button 
       android:id="@+id/bLeft" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="LEFT" /> 

      <Button 
       android:id="@+id/bRight" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="RIGHT" /> 
     </LinearLayout> 


     <LinearLayout 
      android:layout_gravity="center_horizontal" 
      android:id="@+id/llCropOverlay" 
      android:layout_width="match_parent" 
      android:layout_height="70dp" 
      android:background="@color/colorCropOverlay" 
      android:orientation="vertical" /> 
    </FrameLayout> 
</LinearLayout> 

最後的LinearLayout(llCropOverlay)應調整。請注意,我在編程上將寬度更改爲300,然後再使用調整按鈕的大小,以便測試按鈕是否正常工作。

+0

後的完整佈局。有辦法做到這一點,但它不只是你的佈局參數的問題,而是你如何佈置在你的父母。 –

+0

發佈了xml代碼 – Usman

+1

如何改變佈局的寬度而不是改變頁邊距? 'match_parent' + L-margin> R-margin,如果你想正確地移動/展開它。 (等於模擬居中) – TWL

回答

1

我發現了一個幾乎完美的解決方案(有時會出現一個令人討厭的像素問題 - 任何建議都將被讚賞)。

爲此,我們需要設置一些變量。首先,必須找到並標識名爲llCropOverlay的LinearLayout。 下面是它的xml:

 <LinearLayout 
      android:layout_gravity="center_horizontal" 
      android:id="@+id/llCropOverlay" 
      android:layout_width="200dp" 
      android:layout_height="150dp" 
      android:background="@color/colorCropOverlay" 
      android:orientation="vertical" /> 

現在允許用戶之前進行交互,我們需要找到llCropOverlay的原始位置。因此,在OnCreate中()使用此:

llCropOverlay.post(new Runnable() { 
      @Override 
      public void run() { 
       orgX = llCropOverlay.getX(); 
      } 
     }); 

現在設置了所有的按鈕,並設置這些按鈕的setOnTouchListener()。然後當聽者被調用時,按照以下方法傳遞觸摸的按鈕。使用Handler和postDelayed()繼續調用此方法直到按下按鈕。或者調用一次來調整一個像素行/列的大小。

void handleTouchOrClick(View view) { 
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) 
       llCropOverlay.getLayoutParams(); 

    switch (view.getId()) { 
     case R.id.bUp: 
      params.height = params.height - 1; 
      break; 
     case R.id.bDown: 
      params.height = params.height + 1; 
      break; 
     case R.id.bRight: 
      params.width = params.width + 1; 
      llCropOverlay.post(new Runnable() { 
       @Override 
       public void run() { 
        llCropOverlay.setX(orgX); 
       } 
      }); 
      break; 
     case R.id.bRightContract: 
      params.width = params.width - 1; 
      llCropOverlay.post(new Runnable() { 
       @Override 
       public void run() { 
        llCropOverlay.setX(orgX); 
       } 
      }); 
      break; 
     case R.id.bLeft: 
      params.width = params.width + 1; 
      orgX--; 
      llCropOverlay.post(new Runnable() { 
       @Override 
       public void run() { 
        llCropOverlay.setX(orgX); 
       } 
      }); 
      break; 
     case R.id.bLeftContract: 
      params.width = params.width - 1; 
      orgX++; 
      llCropOverlay.post(new Runnable() { 
       @Override 
       public void run() { 
        llCropOverlay.setX(orgX); 
       } 
      }); 
      break; 
    } 
    llCropOverlay.setLayoutParams(params); 
} 

現在這裏是我們如何真正調整圖像大小: 爲了便於我種植的兩個步驟的用戶。從側面

作物:

  ViewGroup.MarginLayoutParams params = 
    (ViewGroup.MarginLayoutParams) llCropOverlay.getLayoutParams(); 

        float eventX = params.width; 
        float eventY = 0; 
        float[] eventXY = new float[]{eventX, eventY}; 

        Matrix invertMatrix = new Matrix(); 
        imageView.getImageMatrix().invert(invertMatrix); 

        invertMatrix.mapPoints(eventXY); 
        int x = Integer.valueOf((int) eventXY[0]); 
        int y = Integer.valueOf((int) eventXY[1]); 

        int height = params.height; 
        while (height * 3 > originalBitmap.getHeight()) { 
         height = height - 10; 
        } 
        croppedBitmapByWidth = Bitmap.createBitmap(originalBitmap, (int) orgX, 0, 
          x, height); 
        imageView.setImageBitmap(croppedBitmapByWidth);  

作物從底部:

    float eventX2 = 0; 
        float eventY2 = params.height; 
        float[] eventXY2 = new float[]{eventX2, eventY2}; 

        Matrix invertMatrix2 = new Matrix(); 
        imageView.getImageMatrix().invert(invertMatrix2); 

        invertMatrix2.mapPoints(eventXY2); 
        int x2 = Integer.valueOf((int) eventXY2[0]); 
        int y2 = Integer.valueOf((int) eventXY2[1]); 

        croppedBitmapByHeight = Bitmap.createBitmap(croppedBitmapByWidth, 0, 0, 
           croppedBitmapByWidth.getWidth(), y2); 
        imageView.setImageBitmap(croppedBitmapByHeight);