Hoạt ảnh tỷ lệ hình ảnh Android liên quan đến điểm trung tâm


88

Tôi có ImageView và tôi tạo một hoạt ảnh tỷ lệ đơn giản cho nó. Mã rất chuẩn.

Scale_up.xml của tôi:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:fromXScale="1"
           android:fromYScale="1"
           android:toXScale="1.2"
           android:toYScale="1.2"
           android:duration="175"/>
</set>

Mã hoạt ảnh của tôi:

Animation a = AnimationUtils.loadAnimation(this, R.anim.scale_up);
((ImageView) findViewById(R.id.circle_image)).startAnimation(a);

Vấn đề:

Khi hình ảnh chia tỷ lệ, nó không chia tỷ lệ từ trung tâm mà từ góc trên cùng bên trái. Nói cách khác, xác minh tỷ lệ của hình ảnh không có cùng điểm với tâm, nhưng nó có cùng điểm trên cùng bên trái. Đây là một liên kết giải thích ý tôi muốn nói. Hình ảnh đầu tiên là cách hoạt ảnh chia tỷ lệ và hình ảnh thứ hai là cách tôi muốn nó chia tỷ lệ. Nó nên giữ nguyên điểm trung tâm. Tôi đã thử thiết lập lực hấp dẫn trên hình ảnh, trên vùng chứa, căn trái hoặc phải, nó luôn có tỷ lệ như nhau. Tôi đang sử dụng RelativeLayout cho màn hình chính và ImageView nằm trong một RelativeLayout khác, nhưng tôi đã thử các bố cục khác, không có gì thay đổi.

Câu trả lời:


76

Quên bản dịch bổ sung, đặt android:pivotX, android:pivotYthành một nửa chiều rộng và chiều cao và nó sẽ chia tỷ lệ từ giữa hình ảnh.


2
pivotXpivotYphải được đặt thành một nửa viewportWidthviewportHeightchính xác.
toobsco42

162

50% là trung tâm của chế độ xem động.

50%p là trung tâm của cha mẹ

<scale
    android:fromXScale="1.0"
    android:toXScale="1.2"
    android:fromYScale="1.0"
    android:toYScale="1.2"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="175"/>

30
cho tôi 50% đã làm công việc (không p)
agamov

5
nó sẽ không có p nếu nó liên quan đến chiều rộng hoặc chiều cao của thành phần mà bạn đang áp dụng hoạt ảnh. p đề cập đến thành phần cha của thành phần mà bạn đang áp dụng hoạt ảnh.
Alan Deep

Làm thế nào để sử dụng 50%ptrong các tệp Java, thay vì XML?
Nikola K.

6
ScaleAnimation mới (1.0f, 1.2f, 1.0f, 1.2f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);
Jiang Qi

Ngoài ra còn có "a" - Animation.ABSOLUTE để đặt bằng px.
Zon

120

Câu trả lời được cung cấp bởi @stevanveltema và @JiangQi là hoàn hảo nhưng nếu bạn muốn mở rộng quy mô bằng cách sử dụng mã, thì bạn có thể sử dụng câu trả lời của tôi.

// first 0f, 1f mean scaling from X-axis to X-axis, meaning scaling from 0-100%
// first 0f, 1f mean scaling from Y-axis to Y-axis, meaning scaling from 0-100%
// The two 0.5f mean animation will start from 50% of X-axis & 50% of Y-axis, i.e. from center

ScaleAnimation fade_in =  new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
fade_in.setDuration(1000);     // animation duration in milliseconds
fade_in.setFillAfter(true);    // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
view.startAnimation(fade_in);

1
@ T.Todua Lỗi gì? Vui lòng đặt một câu hỏi mới và liên kết trở lại câu trả lời này.
Rohan Kandwal

7

Bạn có thể sử dụng hoạt ảnh dịch trong tập hợp của mình để bù đắp điều đó. Có thể bạn sẽ cần điều chỉnh các giá trị toXDelta và toYDelta cho đúng để giữ cho hình ảnh được căn giữa.

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="1.2"
        android:toYScale="1.2"
        android:duration="175"/>
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="-20%"
        android:toYDelta="-20%"
        android:duration="175"/>
</set>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.