我想通過彎曲path.Is可以在Android的移動圖像?我搜索了很多,但我只能找到有關規模,旋轉和翻譯動畫。所以任何人有任何想法請help.Is它可能在Android?
回答
您可以執行逐幀動畫。您可以逐步放置對象以創建曲線。這將是有限的重用,但你可以做到。
或者您可以編寫自己的動畫來創建TweenAnimation的子類,該子類可以沿着曲線進行動畫製作。如果你擅長數學並且能夠理解貝塞爾曲線,那麼這可能是一個直截了當的選擇。一旦你有了這門課程,你就可以輕鬆地在任何彎曲的路徑上進行動畫製作,但這更加有效。
http://en.wikipedia.org/wiki/B%C3%A9zier_curve
這裏的一些Java代碼:
Thanks.Do你有任何示例或任何職位的任何鏈接? –
你能告訴我如何創建我自己的動畫類作爲tweenanimation的子類。 –
下面是全功能的代碼,將沿三個點定義的曲線路徑動畫。 Point只是一個擁有x值和y值的類(儘管您可以輕鬆地將其擴展爲更多維)。
所有的m變量都取自TranslateAnimation並以類似的方式使用,所以如果某些東西沒有意義,您應該可以將它與TranslateAnimation代碼相對比較eaSILY。
在initialize中對resolveSize的調用意味着您可以使用任何動畫類型(ABSOLUTE,RELATIVE_TO_SELF,RELATIVE_TO_PARENT)指定弧的開始,結束和半徑,就像正常的TranslateAnimation一樣。
calcBezier計算直接從Wikipedia取得的二次貝塞爾曲線。 Bezier曲線應該允許平滑縮放,並且在圖形中很常見(並且在Android的Path類中也有使用)。
實際運動發生在applyTransformation中。 interpolatedTime給出一個介於0和1之間的值,該值根據所提供的內插器非線性增加。 dx和dy是給定時間沿曲線的實際x和y點。
這個類的唯一限制是在y中的最大變化總是發生在曲線的中心(參見初始化middleX計算)。但是它會很容易修改,例如,提供沿處,如果你想有一個非對稱的曲線應該發生在高點的曲線上的特定點。
查看TranslateAnimation的android代碼特別有用。請參閱:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.5_r1/android/view/animation/TranslateAnimation.java#TranslateAnimation
public class ArcTranslate extends Animation {
private Point start;
private Point end;
private Point middle;
private final float mFromXValue;
private final float mToXValue;
private final float mYValue;
private final int mFromXType;
private final int mToXType;
private final int mYType;
/**
* A translation along an arc defined by three points and a Bezier Curve
*
* @param duration - the time in ms it will take for the translation to complete
* @param fromXType - One of Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or Animation.RELATIVE_TO_PARENT.
* @param fromXValue - Change in X coordinate to apply at the start of the animation
* @param toXType - One of Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or Animation.RELATIVE_TO_PARENT.
* @param toXValue - Change in X coordinate to apply at the end of the animation
* @param yType - One of Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or Animation.RELATIVE_TO_PARENT.
* @param yValue - Change in Y coordinate to apply at the middle of the animation (the radius of the arc)
*/
public ArcTranslate(long duration, int fromXType, float fromXValue,
int toXType, float toXValue, int yType, float yValue){
setDuration(duration);
mFromXValue = fromXValue;
mToXValue = toXValue;
mYValue = yValue;
mFromXType = fromXType;
mToXType = toXType;
mYType = yType;
}
/** Calculate the position on a quadratic bezier curve given three points
* and the percentage of time passed.
* from http://en.wikipedia.org/wiki/B%C3%A9zier_curve
* @param interpolatedTime - the fraction of the duration that has passed where 0<=time<=1
* @param p0 - a single dimension of the starting point
* @param p1 - a single dimension of the middle point
* @param p2 - a single dimension of the ending point
*/
private long calcBezier(float interpolatedTime, float p0, float p1, float p2){
return Math.round((Math.pow((1 - interpolatedTime), 2) * p0)
+ (2 * (1 - interpolatedTime) * interpolatedTime * p1)
+ (Math.pow(interpolatedTime, 2) * p2));
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
float dx = calcBezier(interpolatedTime, start.x, middle.x, end.x);
float dy = calcBezier(interpolatedTime, start.y, middle.y, end.y);
t.getMatrix().setTranslate(dx, dy);
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
float startX = resolveSize(mFromXType, mFromXValue, width, parentWidth);
float endX = resolveSize(mToXType, mToXValue, width, parentWidth);
float middleY = resolveSize(mYType, mYValue, width, parentWidth);
float middleX = startX + ((endX-startX)/2);
start = new Point(startX, 0);
end = new Point(endX, 0);
middle = new Point(middleX, middleY);
}
}
@Monkeyless非常感謝你的代碼。我設法使用此代碼爲imageview設置動畫效果。但是在動畫時,我無法將onClickListener設置爲圖像視圖。我發佈了一個問題[這裏](http://stackoverflow.com/questions/23947114/onclicklistener-not-triggered-during-animation)。請幫忙。 –
您可以創建自己的類這樣的:
public class BezierTranslateAnimation extends TranslateAnimation {
private int mFromXType = ABSOLUTE;
private int mToXType = ABSOLUTE;
private int mFromYType = ABSOLUTE;
private int mToYType = ABSOLUTE;
private float mFromXValue = 0.0f;
private float mToXValue = 0.0f;
private float mFromYValue = 0.0f;
private float mToYValue = 0.0f;
private float mFromXDelta;
private float mToXDelta;
private float mFromYDelta;
private float mToYDelta;
private float mBezierXDelta;
private float mBezierYDelta;
public BezierTranslateAnimation(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta, float bezierXDelta, float bezierYDelta) {
super(fromXDelta, toXDelta, fromYDelta, toYDelta);
mFromXValue = fromXDelta;
mToXValue = toXDelta;
mFromYValue = fromYDelta;
mToYValue = toYDelta;
mFromXType = ABSOLUTE;
mToXType = ABSOLUTE;
mFromYType = ABSOLUTE;
mToYType = ABSOLUTE;
mBezierXDelta = bezierXDelta;
mBezierYDelta = bezierYDelta;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
float dx=0,dy=0;
if (mFromXValue != mToXValue) {
dx = (float) ((1.0-interpolatedTime)*(1.0-interpolatedTime)*mFromXValue + 2.0*interpolatedTime*(1.0-interpolatedTime)*mBezierXDelta + interpolatedTime*interpolatedTime*mToXValue);
}
if (mFromYValue != mToYValue) {
dy = (float) ((1.0-interpolatedTime)*(1.0-interpolatedTime)*mFromYValue + 2.0*interpolatedTime*(1.0-interpolatedTime)*mBezierYDelta + interpolatedTime*interpolatedTime*mToYValue);
}
t.getMatrix().setTranslate(dx, dy);
}
}
然後用這個簽名使用它:
BezierTranslateAnimation(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta, float bezierXDelta, float bezierYDelta);
你不使用動畫的類型... –
它是由Monkeyless的回答啓發。 我創建了動畫的一個子類,使用PathMeasure來計算翻譯。 您可以使用Path創建一個新的PathAnimation,並像其他任何動畫一樣使用它。
https://github.com/coocood/PathAnimation
public class PathAnimation extends Animation {
private PathMeasure measure;
private float[] pos = new float[2];
public PathAnimation(Path path) {
measure = new PathMeasure(path, false);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t){
measure.getPosTan(measure.getLength() * interpolatedTime, pos,null);
t.getMatrix().setTranslate(pos[0], pos[1]);
}
}
- 1. 彎曲樹垂直滾動問題
- 2. 動態彎曲值呈現
- 3. 回合數問題彎曲
- 4. UITableViewCell在滾動時彎曲動畫
- 5. 三JS彎曲(彎曲)CSS3DObject
- 6. ,動態彎曲verticalaxisrenderers
- 7. 彎曲組合框自定義問題
- 8. Eclipse的插件彎曲問題
- 9. 問題的typedef與野牛和彎曲
- 10. 在彎曲項目中顯示彎曲
- 11. 畫布上的彎曲粗箭頭
- 12. HTML畫布 - 繪製彎曲的箭頭
- 13. 頁面捲曲動畫 - 問題
- 14. 關於Bezier曲線實現的問題?
- 15. CSS3動畫出現問題
- 16. 龜彎曲線
- 17. 直線彎曲
- 18. 彎曲圖像
- 19. 調用彎曲
- 20. 轉換捲曲彎曲
- 21. 在滾動條上畫一條彎曲的虛線SVG
- 22. 如何在qml中實現彎曲的scrollview?
- 23. 如何彎曲/曲線HTML5畫布圖像
- 24. Android彎曲查看畫布以產生捲曲效果
- 25. 車輛的現實轉彎
- 26. 彎曲的UITableView/UIScrollView
- 27. Gef BendPoints彎曲的
- 28. CSS3彎曲效果
- 29. 彎曲的Y軸
- 30. 彎曲度輸出
看到這個答案:[準備曲線的Android翻譯動畫(http://stackoverflow.com/questions/8354441/how-to-prepare-curve-translate-animation-for- android/27948353#27948353) – Sheharyar