由网友(旧时光。)分享简介:我开发一个应用程序在那里,我在我的ImageView拖入活动。我已经配置 Facebook的反弹库 春季动画这是最初使用了Facebook Messenger的的聊天头动画。我想,当我将它拖到这样的动画添加到我的ImageView。视频 到目前为止,我能得到春天的动画,当我触摸ImageView的(上rootvi...
我开发一个应用程序在那里,我在我的ImageView拖入活动。 我已经配置 Facebook的反弹库 春季动画这是最初使用了Facebook Messenger的的聊天头动画。我想,当我将它拖到这样的动画添加到我的ImageView。 视频
到目前为止,我能得到春天的动画,当我触摸ImageView的(上rootview实施春季),这是我的code。我如何可以实现天然型拖曳效应,以我的ImageView的。
公共类MainTry延伸活动{
INT WINDOWWIDTH;
INT WINDOWHEIGHT;
私人的LayoutParams的LayoutParams;
私人最终BaseSpringSystem mSpringSystem = SpringSystem.create();
私人的FrameLayout mRootView;
私人春春;
私人查看mImageView;
私人VelocityTracker速度= NULL;
私人浮动DX;
私人浮动DY;
私人查看rootView;
私人ImageView的IMG;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.layout);
//创建系统运行物理学环为一组弹簧。
SpringSystem springSystem = SpringSystem.create();
//一个弹簧添加到该系统。
春天= springSystem.createSpring();
rootView = getWindow()。getDecorView()
.findViewById(android.R.id.content);
。WINDOWWIDTH = getWindowManager()getDefaultDisplay()的getWidth()。
。WINDOWHEIGHT = getWindowManager()getDefaultDisplay()的getHeight();
IMG =(ImageView的)findViewById(R.id.imageView2);
rootView.setOnTouchListener(新View.OnTouchListener(){
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
开关(event.getAction()){
案例MotionEvent.ACTION_DOWN:
// spring.setEndValue(1);
打破;
案例MotionEvent.ACTION_UP:
案例MotionEvent.ACTION_CANCEL:
// spring.setEndValue(0);
打破;
}
返回true;
}
});
//添加一个监听器来观察弹簧的运动。
spring.addListener(新SimpleSpringListener(){
@覆盖
公共无效onSpringUpdate(春春){
//你可以观察在春季更新
//国家通过要求在onSpringUpdate其当前值。
浮点值=(浮点)spring.getCurrentValue();
浮规模= .5f - (值* 0.1F);
img.setScaleX(规模);
img.setScaleY(规模);
}
});
// spring.setEndValue(1);
img.setOnTouchListener(新View.OnTouchListener(){
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
的LayoutParams的LayoutParams =(的LayoutParams)IMG
.getLayoutParams();
开关(event.getAction()){
案例MotionEvent.ACTION_DOWN:
DX = event.getRawX() - 10;
DY = event.getRawY() - 10;
如果(速度== NULL){
//获得一个新的VelocityTracker对象,监控
//运动的速度。
速度= VelocityTracker.obtain();
} 其他 {
//重置速度跟踪回到它的初始状态。
velocity.clear();
}
打破;
案例MotionEvent.ACTION_MOVE:
DX = event.getRawX() - 10;
DY = event.getRawY() - 10;
velocity.addMovement(事件);
spring.setVelocity(velocity.getYVelocity());
spring.setCurrentValue(DY);
spring.setEndValue(DY);
layoutParams.leftMargin =(INT)DX - 10;
layoutParams.topMargin =(INT)DY - 10;
img.setLayoutParams(的LayoutParams);
打破;
案例MotionEvent.ACTION_CANCEL:
打破;
案例MotionEvent.ACTION_UP:
velocity.addMovement(事件);
spring.setVelocity(velocity.getYVelocity());
spring.setCurrentValue(event.getRawY() - 10);
spring.setEndValue(0);
打破;
默认:
打破;
}
返回true;
}
});
}
@覆盖
公共无效onResume(){
super.onResume();
}
@覆盖
公共无效的onPause(){
super.onPause();
}
}
解决方案
怎么样的:
V类扩展视图实现SpringListener {
私有静态最终诠释NUM_ELEMS = 4;
私人温泉[] mXSprings =新的春天[NUM_ELEMS]
私人温泉[] mYSprings =新的春天[NUM_ELEMS]
民营涂料mPaint =新的油漆();
私人位图mBitmap = BitmapFactory.de codeResource(getResources(),R.drawable.ic_launcher);
公共V(上下文的背景下){
超(上下文);
SpringSystem SS = SpringSystem.create();
弹簧S;
的for(int i = 0; I< NUM_ELEMS;我++){
S = ss.createSpring();
s.setSpringConfig(新MySpringConfig(200,我== 0 8:15 + I * 2,我,真));
s.addListener(本);
mXSprings [I] =秒;
S = ss.createSpring();
s.setSpringConfig(新MySpringConfig(200,我== 0 8:15 + I * 2,我,FALSE));
s.addListener(本);
mYSprings [I] =秒;
}
}
@覆盖
保护无效onSizeChanged(INT W,INT小时,INT oldw,诠释oldh){
mXSprings [0] .setCurrentValue(瓦特/ 2);
mYSprings [0] .setCurrentValue(0);
mXSprings [0] .setEndValue(瓦特/ 2);
mYSprings [0] .setEndValue(H / 2);
}
@覆盖
公共无效onSpringActivate(弹簧S){
}
@覆盖
公共无效onSpringAtRest(弹簧S){
}
@覆盖
公共无效onSpringEndStateChange(弹簧S){
}
@覆盖
公共无效onSpringUpdate(弹簧S){
MySpringConfig CFG =(MySpringConfig)s.getSpringConfig();
如果(cfg.index< NUM_ELEMS - 1){
春天[]弹簧= cfg.horizontal? mXSprings:mYSprings;
弹簧[cfg.index + 1〕.setEndValue(s.getCurrentValue());
}
如果(cfg.index == 0){
无效();
}
}
@覆盖
公共布尔的onTouchEvent(MotionEvent事件){
mXSprings [0] .setEndValue(event.getX());
mYSprings [0] .setEndValue(event.getY());
返回true;
}
@覆盖
保护无效的OnDraw(帆布油画){
的for(int i = NUM_ELEMS - 1; I> = 0;我 - ){
mPaint.setAlpha(我== 0 255:192 - I * 128 / NUM_ELEMS);
canvas.drawBitmap(mBitmap,
(浮点型)mXSprings [I] .getCurrentValue() - mBitmap.getWidth()/ 2,
(浮点型)mYSprings [I] .getCurrentValue() - mBitmap.getHeight()/ 2,
mPaint);
}
}
类MySpringConfig扩展SpringConfig {
INT指数;
布尔水平;
公共MySpringConfig(双张力,双摩擦,INT指数,布尔水平){
超(紧张,摩擦);
this.index =指数;
this.horizontal =水平;
}
}
}
I am developing one app where I am dragging around my ImageView in Activity. I have configured Facebook Rebound library for spring animation which is originally used in Facebook Messenger's chat heads animations. I want to add this kind of animations to my ImageView when I drag it. VIDEO
So far I am able to get spring animation when I touch ImageView (implemented spring on rootview), this is my code. How can I implement that natural type of dragging effect to my ImageView.
public class MainTry extends Activity {
int windowwidth;
int windowheight;
private LayoutParams layoutParams;
private final BaseSpringSystem mSpringSystem = SpringSystem.create();
private FrameLayout mRootView;
private Spring spring;
private View mImageView;
private VelocityTracker velocity = null;
private float dx;
private float dy;
private View rootView;
private ImageView img;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
// Create a system to run the physics loop for a set of springs.
SpringSystem springSystem = SpringSystem.create();
// Add a spring to the system.
spring = springSystem.createSpring();
rootView = getWindow().getDecorView()
.findViewById(android.R.id.content);
windowwidth = getWindowManager().getDefaultDisplay().getWidth();
windowheight = getWindowManager().getDefaultDisplay().getHeight();
img = (ImageView) findViewById(R.id.imageView2);
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// spring.setEndValue(1);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// spring.setEndValue(0);
break;
}
return true;
}
});
// Add a listener to observe the motion of the spring.
spring.addListener(new SimpleSpringListener() {
@Override
public void onSpringUpdate(Spring spring) {
// You can observe the updates in the spring
// state by asking its current value in onSpringUpdate.
float value = (float) spring.getCurrentValue();
float scale = .5f - (value * 0.1f);
img.setScaleX(scale);
img.setScaleY(scale);
}
});
// spring.setEndValue(1);
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
LayoutParams layoutParams = (LayoutParams) img
.getLayoutParams();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
dx = event.getRawX() - 10;
dy = event.getRawY() - 10;
if (velocity == null) {
// Retrieve a new VelocityTracker object to watch the
// velocity of a motion.
velocity = VelocityTracker.obtain();
} else {
// Reset the velocity tracker back to its initial state.
velocity.clear();
}
break;
case MotionEvent.ACTION_MOVE:
dx = event.getRawX() - 10;
dy = event.getRawY() - 10;
velocity.addMovement(event);
spring.setVelocity(velocity.getYVelocity());
spring.setCurrentValue(dy);
spring.setEndValue(dy);
layoutParams.leftMargin = (int) dx - 10;
layoutParams.topMargin = (int) dy - 10;
img.setLayoutParams(layoutParams);
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_UP:
velocity.addMovement(event);
spring.setVelocity(velocity.getYVelocity());
spring.setCurrentValue(event.getRawY() - 10);
spring.setEndValue(0);
break;
default:
break;
}
return true;
}
});
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
}
解决方案
what about this:
class V extends View implements SpringListener {
private static final int NUM_ELEMS = 4;
private Spring[] mXSprings = new Spring[NUM_ELEMS];
private Spring[] mYSprings = new Spring[NUM_ELEMS];
private Paint mPaint = new Paint();
private Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
public V(Context context) {
super(context);
SpringSystem ss = SpringSystem.create();
Spring s;
for (int i = 0; i < NUM_ELEMS; i++) {
s = ss.createSpring();
s.setSpringConfig(new MySpringConfig(200, i == 0? 8 : 15 + i * 2, i, true));
s.addListener(this);
mXSprings[i] = s;
s = ss.createSpring();
s.setSpringConfig(new MySpringConfig(200, i == 0? 8 : 15 + i * 2, i, false));
s.addListener(this);
mYSprings[i] = s;
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mXSprings[0].setCurrentValue(w / 2);
mYSprings[0].setCurrentValue(0);
mXSprings[0].setEndValue(w / 2);
mYSprings[0].setEndValue(h / 2);
}
@Override
public void onSpringActivate(Spring s) {
}
@Override
public void onSpringAtRest(Spring s) {
}
@Override
public void onSpringEndStateChange(Spring s) {
}
@Override
public void onSpringUpdate(Spring s) {
MySpringConfig cfg = (MySpringConfig) s.getSpringConfig();
if (cfg.index < NUM_ELEMS - 1) {
Spring[] springs = cfg.horizontal? mXSprings : mYSprings;
springs[cfg.index + 1].setEndValue(s.getCurrentValue());
}
if (cfg.index == 0) {
invalidate();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mXSprings[0].setEndValue(event.getX());
mYSprings[0].setEndValue(event.getY());
return true;
}
@Override
protected void onDraw(Canvas canvas) {
for (int i = NUM_ELEMS - 1; i >= 0; i--) {
mPaint.setAlpha(i == 0? 255 : 192 - i * 128 / NUM_ELEMS);
canvas.drawBitmap(mBitmap,
(float) mXSprings[i].getCurrentValue() - mBitmap.getWidth() / 2,
(float) mYSprings[i].getCurrentValue() - mBitmap.getHeight() / 2,
mPaint);
}
}
class MySpringConfig extends SpringConfig {
int index;
boolean horizontal;
public MySpringConfig(double tension, double friction, int index, boolean horizontal) {
super(tension, friction);
this.index = index;
this.horizontal = horizontal;
}
}
}
相关推荐
最新文章