Android:弹出窗口中的旋转视图被剪裁

时间:2013-09-13 09:59:11

标签: android view rotation popup popupwindow

我正在尝试在自定义ListView内轮换popupWindow。以下是我的设置:

这是弹出式XML board_dialog.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/boardll"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">

    <ListView
        android:id="@+id/boardoptions"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/options_array_board" /> 
</RelativeLayout>

我的自定义BoardPopup课程:

public class BoardPopup extends PopupWindow {
    private static final String TAG = BoardPopup.class.getSimpleName();    

    Context context;  
    RelativeLayout ll;
    ListView lv;

    private OnSubmitListener mListener;  

    public BoardPopup (Context ctx, OnSubmitListener listener) {  
        super(ctx);  

        context = ctx;  
        mListener = listener;  

        setContentView(LayoutInflater.from(context).inflate(R.layout.board_dialog, null));  
        setHeight(WindowManager.LayoutParams.WRAP_CONTENT);  
        setWidth(WindowManager.LayoutParams.WRAP_CONTENT);  
        View popupView = getContentView();  
        setFocusable(true);  

        lv = (ListView) popupView.findViewById(R.id.boardoptions);
        ll = (RelativeLayout) popupView.findViewById(R.id.boardll);        
    }  

    public void show(View v) {        
        showAtLocation(v, Gravity.CENTER, 0, 0); 
    }  

    public interface OnSubmitListener {  
        void valueChanged(String name, String number);  
    }

    public void fixDimensions() {
        getContentView().setBackgroundColor(Color.RED); //to highlight views
        ll.setRotation(90);
        update(292,630); //These numbers are not meant to be constant        
    }  
}

在我的活动中,显示弹出窗口,我必须覆盖onWindowFocusChanged才能获得弹出窗口内视图的后期绘制尺寸:

popup = new BoardPopup(c, MainGamePanel.this);
popupJustCreated = true;
popup.show(v);

@Override
 public void onWindowFocusChanged(boolean hasFocus) {
      super.onWindowFocusChanged(hasFocus);
      if (popup!=null && popupJustCreated) {
          popup.fixDimensions();
          popupJustCreated = false;
      }
 }

如果我在ll.setRotation(90);中评论update(292,630);fixDimensions(),那么一切看起来都很正常:

enter image description here


如果我添加ll.setRotation(90);

enter image description here


最后,如果我添加update(292,630);

enter image description here


在最终图像中,为什么布局没有填充弹出窗口?灰色区域是什么视图?如何才能正常旋转和调整大小?

我尝试过的其他一些事情没有成功:

  • 使用LinearLayout代替RelativeLayout
  • wrap_contentmatch_parent
  • 的所有不同组合
  • 使用自定义DialogFragment
  • 执行基本相同的操作

1 个答案:

答案 0 :(得分:0)

我有一个非常相似的问题,只是找到了解决方法。我使用view rotationX属性在RecyclerView中旋转项目,并不断看到奇怪的剪切行为,如上面的图像。对我有用的是使用以下参数在父视图(在我的情况下为RecyclerView)上调用setLayerType:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

对于API> = 14,默认层类型为LAYER_TYPE_HARDWARE。本质上,我会说这是一个Android错误。