뷰의 절대 위치 설정
안드로이드에서 뷰의 절대 위치를 설정할 수 있습니까?(나는 알고 있습니다.) 것을 알고 있습니다.AbsoluteLayout하지만 더 이상 사용하지 않습니다...)
예를 들어 240x320px 화면이 있는 경우 어떻게 추가할 수 있습니까?ImageView중심이 (100,100) 위치에 있도록 20x20인치인 것은?
상대 레이아웃을 사용할 수 있습니다.레이아웃 내의 위치(50,60)에서 30x40 ImageView를 원한다고 가정해 보겠습니다.활동의 일부:
// Some existing RelativeLayout from your layout xml
RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);
ImageView iv = new ImageView(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);
기타 예:
(50, 60) 및 (80, 90)에 각각 두 개의 30x40 이미지 보기(노란색 하나, 빨간색 하나)를 배치합니다.
RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);
ImageView iv;
RelativeLayout.LayoutParams params;
iv = new ImageView(this);
iv.setBackgroundColor(Color.YELLOW);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);
iv = new ImageView(this);
iv.setBackgroundColor(Color.RED);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 80;
params.topMargin = 90;
rl.addView(iv, params);
노란색 이미지 보기를 기준으로 한 30x40 노란색 이미지 보기를 (50,60)에 배치하고 다른 30x40 빨간색 이미지 보기 <80,90>를 배치합니다.
RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);
ImageView iv;
RelativeLayout.LayoutParams params;
int yellow_iv_id = 123; // Some arbitrary ID value.
iv = new ImageView(this);
iv.setId(yellow_iv_id);
iv.setBackgroundColor(Color.YELLOW);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);
iv = new ImageView(this);
iv.setBackgroundColor(Color.RED);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 80;
params.topMargin = 90;
// This line defines how params.leftMargin and params.topMargin are interpreted.
// In this case, "<80,90>" means <80,90> to the right of the yellow ImageView.
params.addRule(RelativeLayout.RIGHT_OF, yellow_iv_id);
rl.addView(iv, params);
일반적으로 왼쪽 여백 및 위쪽 여백 특성을 지정하여 FrameLayout을 컨테이너로 사용하여 특정 위치에 뷰를 추가할 수 있습니다.
다음 예제에서는 FrameLayout을 전체 화면 용기로 사용하여 20x20px ImageView를 위치(100,200)에 배치합니다.
XML
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:background="#33AAFF"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
활동 / 조각 / 사용자 정의 보기
//...
FrameLayout root = (FrameLayout)findViewById(R.id.root);
ImageView img = new ImageView(this);
img.setBackgroundColor(Color.RED);
//..load something inside the ImageView, we just set the background color
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(20, 20);
params.leftMargin = 100;
params.topMargin = 200;
root.addView(img, params);
//...
이렇게 하면 상대 레이아웃 없이 여백을 절대(X,Y) 좌표로 사용할 수 있으므로 유용합니다.

위의 Andy Zhang의 답변에 추가하기 위해, 만약 당신이 원한다면, rl.addView에 param을 부여한 다음, 나중에 변경할 수 있습니다.
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);
마찬가지로 다음과 같이 쓸 수 있습니다.
params = new RelativeLayout.LayoutParams(30, 40);
rl.addView(iv, params);
params.leftMargin = 50;
params.topMargin = 60;
따라서 params 변수를 유지한다면, iv의 레이아웃을 rl에 추가한 후 언제든지 변경할 수 있습니다.
코드에서 픽셀 값을 하드 코딩하지 않고 보다 깨끗하고 동적인 방법입니다.
클릭한 버튼 바로 아래에 대화상자(즉각 부풀리기)를 배치하고 싶었습니다.
이런 식으로 해결했습니다.
// get the yoffset of the position where your View has to be placed
final int yoffset = < calculate the position of the view >
// position using top margin
if(myView.getLayoutParams() instanceof MarginLayoutParams) {
((MarginLayoutParams) myView.getLayoutParams()).topMargin = yOffset;
}
그러나 의 부모 레이아웃이 의 인스턴스인지 확인해야 합니다.
더 완전한 코드:
// identify the button
final Button clickedButton = <... code to find the button here ...>
// inflate the dialog - the following style preserves xml layout params
final View floatingDialog =
this.getLayoutInflater().inflate(R.layout.floating_dialog,
this.floatingDialogContainer, false);
this.floatingDialogContainer.addView(floatingDialog);
// get the buttons position
final int[] buttonPos = new int[2];
clickedButton.getLocationOnScreen(buttonPos);
final int yOffset = buttonPos[1] + clickedButton.getHeight();
// position using top margin
if(floatingDialog.getLayoutParams() instanceof MarginLayoutParams) {
((MarginLayoutParams) floatingDialog.getLayoutParams()).topMargin = yOffset;
}
이렇게 하면 Java 코드에서 픽셀/dps를 하드 코딩하는 대신 레이아웃 XML 파일을 사용하여 설정된 레이아웃 매개 변수에 대해 대상 보기가 조정될 것으로 예상할 수 있습니다.
누군가에게 도움이 될 경우를 대비하여 아래와 같이 이 애니메이터 ViewPropertyAnimator를 사용해 보십시오.
myView.animate().x(50f).y(100f);
myView.animate().translateX(pixelInScreen)
참고: 이 픽셀은 보기와 관련이 없습니다.이 픽셀은 화면의 픽셀 위치입니다.
bpr10 답변에 대한 크레딧

원하는 X & Y 지점에 원하는 뷰를 배치합니다.
레이아웃 파일
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.test.MainActivity" >
<AbsoluteLayout
android:id="@+id/absolute"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/rlParent"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/btn_blue_matte" />
</RelativeLayout>
</AbsoluteLayout>
</RelativeLayout>
Java 클래스
public class MainActivity extends Activity {
private RelativeLayout rlParent;
private int width = 100, height = 150, x = 20, y= 50;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AbsoluteLayout.LayoutParams param = new AbsoluteLayout.LayoutParams(width, height, x, y);
rlParent = (RelativeLayout)findViewById(R.id.rlParent);
rlParent.setLayoutParams(param);
}
}
다 했어요.
아래 코드를 사용하여 특정 위치에서 보기 설정:-
TextView textView = new TextView(getActivity());
textView.setId(R.id.overflowCount);
textView.setText(count + "");
textView.setGravity(Gravity.CENTER);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
textView.setTextColor(getActivity().getResources().getColor(R.color.white));
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// to handle click
}
});
// set background
textView.setBackgroundResource(R.drawable.overflow_menu_badge_bg);
// set apear
textView.animate()
.scaleXBy(.15f)
.scaleYBy(.15f)
.setDuration(700)
.alpha(1)
.setInterpolator(new BounceInterpolator()).start();
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
layoutParams.topMargin = 100; // margin in pixels, not dps
layoutParams.leftMargin = 100; // margin in pixels, not dps
textView.setLayoutParams(layoutParams);
// add into my parent view
mainFrameLaout.addView(textView);
이 목적을 위해 프레임 레이아웃을 사용하고 있으며 다음은 제 코드입니다.
List<object> content = new List<object>();
object aWebView = new {ContentType="web",Width="300", Height = "300",X="10",Y="30",ContentUrl="http://www.google.com" };
content.Add(aWebView);
object aWebView2 = new { ContentType = "image", Width = "300", Height = "300", X = "20", Y = "40", ContentUrl = "https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4" };
content.Add(aWebView2);
FrameLayout myLayout = (FrameLayout)FindViewById(Resource.Id.frameLayout1);
foreach (object item in content)
{
string contentType = item.GetType().GetProperty("ContentType").GetValue(item, null).ToString();
FrameLayout.LayoutParams param = new FrameLayout.LayoutParams(Convert.ToInt32(item.GetType().GetProperty("Width").GetValue(item, null).ToString()), Convert.ToInt32(item.GetType().GetProperty("Height").GetValue(item, null).ToString()));
param.LeftMargin = Convert.ToInt32(item.GetType().GetProperty("X").GetValue(item, null).ToString());
param.TopMargin = Convert.ToInt32(item.GetType().GetProperty("Y").GetValue(item, null).ToString());
switch (contentType) {
case "web":{
WebView webview = new WebView(this);
//webview.hei;
myLayout.AddView(webview, param);
webview.SetWebViewClient(new WebViewClient());
webview.LoadUrl(item.GetType().GetProperty("ContentUrl").GetValue(item, null).ToString());
break;
}
case "image":
{
ImageView imageview = new ImageView(this);
//webview.hei;
myLayout.AddView(imageview, param);
var imageBitmap = GetImageBitmapFromUrl("https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4");
imageview.SetImageBitmap(imageBitmap);
break;
}
}
}
보기가 서로 겹쳐지는 등 모양에 따라 서로 겹치는 뷰 속성이 필요했기 때문에 유용했습니다.
언급URL : https://stackoverflow.com/questions/3294590/set-the-absolute-position-of-a-view
'codememo' 카테고리의 다른 글
| CSS를 사용하여 빈 입력 상자 일치 (0) | 2023.08.26 |
|---|---|
| APK 파일이 디스크에 없습니다. (0) | 2023.08.26 |
| VBA가 자동으로 변경됩니다.범위는 .range입니다. (0) | 2023.08.26 |
| Spring WebSocket @SendToSession: 특정 세션으로 메시지 보내기 (0) | 2023.08.26 |
| 도커와 도커 구성의 차이점은 무엇입니까? (0) | 2023.08.26 |