보기에 Android 스케일 애니메이션
ScaleAnimation (xml이 아닌 프로그래밍 방식)을 사용하여 높이를 부모 높이의 0에서 60 %로 변경하고 싶습니다. 보기 너비는 일정하며 50px입니다. 보기가 비어 있습니다. 배경색 만 설정됩니다.
누군가 코드에서 scaleAnim
ScaleAnimation 을 사용하는 코드를 줄 수 있습니까 ?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layContainer
>
<View
android:layout_width="50px"
android:layout_height="fill_parent"
android:id="@+id/viewContainer"
android:background:"#00f00"
/>
</LinearLayout>
ScaleAnimation scaleAnim = new ScaleAnimation(...);
애니메이션 전후보기. 감사합니다.
다음은이를 정확히 수행하는 코드입니다.
public void scaleView(View v, float startScale, float endScale) {
Animation anim = new ScaleAnimation(
1f, 1f, // Start and end values for the X axis scaling
startScale, endScale, // Start and end values for the Y axis scaling
Animation.RELATIVE_TO_SELF, 0f, // Pivot point of X scaling
Animation.RELATIVE_TO_SELF, 1f); // Pivot point of Y scaling
anim.setFillAfter(true); // Needed to keep the result of the animation
anim.setDuration(1000);
v.startAnimation(anim);
}
여기에 사용 된 ScaleAnimation 생성자는 우리가 신경 쓰지 않는 X-scale 처리와 관련된 8 개의 인수, 4 개의 인수를 사용합니다 (1f, 1f, ... Animation.RELATIVE_TO_SELF, 0f, ...)
.
다른 4 개의 인수는 우리가 신경 쓰는 Y 스케일링을위한 것입니다.
startScale, endScale
-귀하의 경우에는 0f, 0.6f
.
Animation.RELATIVE_TO_SELF, 1f
-이는 뷰 축소가 축소되는 위치를 지정합니다 (문서에서 피벗이라고 함). 여기에서는 1f
애니메이션이 아래쪽에서 막대를 늘리기 시작 하기 때문에 부동 값을로 설정합니다 . 위에서 아래로 성장하기를 원한다면 0f
.
마지막으로 똑같이 중요한 것은 anim.setFillAfter(true)
. 애니메이션이 완료된 후 애니메이션 결과가 계속 유지되도록하려면 애니메이션을 실행하기 전에 애니메이터에서이를 실행해야합니다.
따라서 귀하의 경우 다음과 같이 할 수 있습니다.
View v = findViewById(R.id.viewContainer);
scaleView(v, 0f, .6f);
이 코드를 사용하여 xml을 사용하지 않고 Scale 애니메이션을 만듭니다.
ScaleAnimation animation = new ScaleAnimation(fromXscale, toXscale, fromYscale, toYscale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
XML에서 이것은 동일한 결과를 얻기 위해 사용하는 것입니다. 더 직관적 일 수 있습니다.
scale_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:duration="200"
android:fromXScale="1.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="100%"
android:toXScale="1.0"
android:toYScale="1.0" />
</set>
scale_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:duration="200"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="100%"
android:toXScale="1.0"
android:toYScale="0.0" />
</set>
X 축의 애니메이션 1.0 -> 1.0
이 그 방향으로 확장되지 않고 전체 너비로 유지되는 반면 0.0 -> 1.0
질문의 그래픽에서 볼 수 있듯이 Y 축 에서는 배율 이 조정됩니다. 이것이 누군가를 돕기를 바랍니다.
일부는 요청 된대로 Java 코드를 알고 싶어 할 수 있습니다.
애니메이션 파일을 anim
폴더에 넣고 다음과 같은 애니메이션 파일을로드하고 설정합니다.
Animation scaleDown = AnimationUtils.loadAnimation(youContext, R.anim.scale_down);
ImagView v = findViewById(R.id.your_image_view);
v.startAnimation(scaleDown);
이 방법 사용
당신이 원하는 경우 규모 분기에을 (반 X 반 Y)
view.animate().scaleX(0.5f).scaleY(0.5f)
스케일 을 원하고 오른쪽 하단으로 이동하려면
view.animate().scaleX(0.5f).scaleY(0.5f)
.translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())
상단 사용 (-view.height/4)
및 왼쪽으로 이동하려는 경우 (-view.width / 4)
애니메이션이 끝난 후 무언가 를 하려면 withEndAction(Runnable runnable)
함수를 사용하십시오 .
알파 및 회전 과 같은 다른 속성을 사용할 수 있습니다.
전체 코드
view.animate()
.scaleX(0.5f).scaleY(0.5f)//scale to quarter(half x,half y)
.translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())// move to bottom / right
.alpha(0.5f) // make it less visible
.rotation(360f) // one round turns
.setDuration(1000) // all take 1 seconds
.withEndAction(new Runnable() {
@Override
public void run() {
//animation ended
}
});
다음 과 같은 도우미 메서드 및 start-repeat-end 핸들러를 사용하여 크기를 조정 합니다.
resize(
view1,
1.0f,
0.0f,
1.0f,
0.0f,
0.0f,
0.0f,
150,
null,
null,
null);
return null;
}
도우미 방법 :
/**
* Resize a view.
*/
public static void resize(
View view,
float fromX,
float toX,
float fromY,
float toY,
float pivotX,
float pivotY,
int duration) {
resize(
view,
fromX,
toX,
fromY,
toY,
pivotX,
pivotY,
duration,
null,
null,
null);
}
/**
* Resize a view with handlers.
*
* @param view A view to resize.
* @param fromX X scale at start.
* @param toX X scale at end.
* @param fromY Y scale at start.
* @param toY Y scale at end.
* @param pivotX Rotate angle at start.
* @param pivotY Rotate angle at end.
* @param duration Animation duration.
* @param start Actions on animation start. Otherwise NULL.
* @param repeat Actions on animation repeat. Otherwise NULL.
* @param end Actions on animation end. Otherwise NULL.
*/
public static void resize(
View view,
float fromX,
float toX,
float fromY,
float toY,
float pivotX,
float pivotY,
int duration,
Callable start,
Callable repeat,
Callable end) {
Animation animation;
animation =
new ScaleAnimation(
fromX,
toX,
fromY,
toY,
Animation.RELATIVE_TO_SELF,
pivotX,
Animation.RELATIVE_TO_SELF,
pivotY);
animation.setDuration(
duration);
animation.setInterpolator(
new AccelerateDecelerateInterpolator());
animation.setFillAfter(true);
view.startAnimation(
animation);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
if (start != null) {
try {
start.call();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onAnimationEnd(Animation animation) {
if (end != null) {
try {
end.call();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onAnimationRepeat(
Animation animation) {
if (repeat != null) {
try {
repeat.call();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public void expand(final View v) {
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 1, 0, 0, 0);
scaleAnimation.setDuration(250);
scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
v.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
v.startAnimation(scaleAnimation);
}
public void collapse(final View v) {
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 0, 1, 0, 0);
scaleAnimation.setDuration(250);
scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
v.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
v.startAnimation(scaleAnimation);
}
참조 URL : https://stackoverflow.com/questions/7414065/android-scale-animation-on-view
'programing' 카테고리의 다른 글
OSX 10.10 Yosemite에 Nokogiri 설치 (0) | 2021.01.16 |
---|---|
UISearchController가 활성화되면 iOS 9 searchBar가 테이블 헤더보기에서 사라집니다. (0) | 2021.01.16 |
Android-애니메이션을 사용하여 왼쪽 여백 변경 (0) | 2021.01.16 |
배열을 이동하는 C # 가장 빠른 방법 (0) | 2021.01.16 |
Ubuntu에 설치된 OpenCV 버전 찾기 (0) | 2021.01.16 |