Прежде всего, извините за мой предыдущий ответ, я почему-то неправильно понял, чего вы хотели достичь, и в коде также были некоторые ошибки.
Мне удалось воспроизвести то, что вы хотите, и ниже вы видите результат .
код просто оборачивает ваш код в Framelayout следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="300dp"
android:layout_height="300dp"
android:id="@+id/frame">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|start"
android:background="#000">
<View
android:id="@+id/shouldBeExcludedFromWrapContent"
android:layout_width="100dp"
android:layout_height="100dp"
app:layout_constraintTop_toBottomOf="@id/partOfWrapContent"
app:layout_constraintLeft_toRightOf="@id/partOfWrapContent"
android:background="@android:drawable/star_big_on" />
<View
android:id="@+id/partOfWrapContent"
android:layout_width="300dp"
android:layout_height="300dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:background="@android:drawable/sym_action_call" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
есть один пропущенный шаг, как в этом коде: размеры framelayout жестко закодированы до 300dp, но если я правильно понимать, что вам нужно их обернуть в partOfWrapContent
, который будет различаться по размеру. Исправление для этого не очень элегантно, но вы можете сделать это в java с помощью следующего кода
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
FrameLayout frame=(FrameLayout) findViewById(R.id.frame) ;
View partOfWrapContent=(View) findViewById(R.id.partOfWrapContent);
ViewGroup.LayoutParams params = frame.getLayoutParams();
//get the desired size of your drawables in dp and feed it into dipH and dipW
float dipH = 300f;
float dipW = 300f;
Resources r = getResources();
float pxH = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dipH,
r.getDisplayMetrics()
);
float pxW = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dipW,
r.getDisplayMetrics()
);
params.height=(int)pxH;
params.width=(int)pxW;
frame.setLayoutParams(params);
findViewById(R.id.shouldBeExcludedFromWrapContent)
.animate()
.rotationBy(5 * 360f)
.translationXBy(-900f)
.translationYBy(-900f)
.setDuration(5_000L)
.start();
}
, в этом коде вам нужно будет указать размер partOfWrapContent
, который, я думаю, вы можете получить из ваших доступных ресурсов. При таком подходе вы можете иметь анимированные объекты, поступающие из любого места (при условии, что это XD снизу или справа), но я полагаю, что вы можете немного изменить это, изменив android:layout_gravity="top|start"
(возможно, используйте слишком большой контраст и вставьте partOfWrapContent
в центре, таким образом, ваши анимированные объекты могут появиться откуда угодно) Я не уверен, что вам достаточно динамически c, но, возможно, это хотя бы даст вам некоторые идеи.