仿携程首页缩放的点击效果

最近下了个携程App,点开首页看,注意到其按钮在点击的时候并不是我们经常看到的变色效果,而是先收缩,放开时,再回到原来的大小,感觉这个效果虽然小,但是感觉非常新颖,于是决定,模仿一下这个小效果,先看一下在携程上的效果,效果如下图所示:

 

再看一下我模仿的效果,如下图所示,效果基本一样。

\0..0亲测在真机上是不会有黑色边框出现的,模拟器上不知为何...

先说一下整体思路:1.继承ImageView,重写onTouchEvent方法。

2.down的时候触发我们的缩小属性动画。

3.up的时候再触发放大动画。

4.定义一个接口回调,用来响应点击事件的处理。

下面是实现代码:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<span style= "font-size:14px;" > package view;
 
import module.BusEvent;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import de.greenrobot.event.EventBus;
 
/**
  * @author rzq
  *
  */
public class ClickImageView extends ImageView {
 
     private Animator anim1;
     private Animator anim2;
     private int mHeight;
     private int mWidth;
     private float mX, mY;
     private Handler mHandler = new Handler();
 
     private ClickListener listener;
 
     public ClickImageView(Context context, AttributeSet attrs) {
         super (context, attrs);
         init();
     }
 
     @Override
     protected void onSizeChanged( int w, int h, int oldw, int oldh) {
         super .onSizeChanged(w, h, oldw, oldh);
         mHeight = getHeight() - getPaddingTop() - getPaddingBottom();
         mWidth = getWidth() - getPaddingLeft() - getPaddingRight();
         mX = getX();
         mY = getY();
     }
 
     private void init() {
 
         PropertyValuesHolder valueHolder_1 = PropertyValuesHolder.ofFloat(
                 "scaleX" , 1f, 0 .9f);
         PropertyValuesHolder valuesHolder_2 = PropertyValuesHolder.ofFloat(
                 "scaleY" , 1f, 0 .9f);
         anim1 = ObjectAnimator.ofPropertyValuesHolder( this , valueHolder_1,
                 valuesHolder_2);
         anim1.setDuration( 200 );
         anim1.setInterpolator( new LinearInterpolator());
 
         PropertyValuesHolder valueHolder_3 = PropertyValuesHolder.ofFloat(
                 "scaleX" , 0 .9f, 1f);
         PropertyValuesHolder valuesHolder_4 = PropertyValuesHolder.ofFloat(
                 "scaleY" , 0 .9f, 1f);
         anim2 = ObjectAnimator.ofPropertyValuesHolder( this , valueHolder_3,
                 valuesHolder_4);
         anim2.setDuration( 200 );
         anim2.setInterpolator( new LinearInterpolator());
     }
 
     public void setClickListener(ClickListener clickListener) {
         this .listener = clickListener;
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         switch (event.getAction()) {
         case MotionEvent.ACTION_DOWN:
             mHandler.post( new Runnable() {
                 @Override
                 public void run() {
                     anim2.end();
                     anim1.start();
                 }
             });
             break ;
         case MotionEvent.ACTION_MOVE:
             break ;
         case MotionEvent.ACTION_UP:
             mHandler.post( new Runnable() {
                 @Override
                 public void run() {
                     anim1.end();
                     anim2.start();
                 }
             });
             if (listener != null ) {
 
                 listener.onClick();
             }
             //EventBus.getDefault().post(BusEvent.TYPE);
             break ;
         case MotionEvent.ACTION_CANCEL:
             break ;
         }
         return true ;
     }
 
     //按下的点是否在View内
     protected boolean innerImageView( float x, float y) {
 
         if (x >= mX && y <= mX + mWidth) {
             if (y >= mY && y <= mY + mHeight) {
                 return true ;
             }
         }
         return false ;
     }
 
     /**
      *  点击事件处理回调 
      * @author renzhiqiang
      *
      */
     public interface ClickListener {
 
         public void onClick();
     }
 
     @Override
     protected void onDetachedFromWindow() {
         // TODO Auto-generated method stub
         super .onDetachedFromWindow();
     }
 
}</span>
  在Activity中的使用:

 

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<span style= "font-size:14px;" > package activity.animatior;
 
import view.ClickImageView;
import view.ClickImageView.ClickListener;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
 
import com.example.listviewanimationdemo.R;
 
public class ClickImageActivity extends Activity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.click_image_layout);
         ClickImageView view = (ClickImageView) findViewById(R.id.image_view_1);
         view.setClickListener( new ClickListener() {
             @Override
             public void onClick() {
                 Toast.makeText(ClickImageActivity. this , "ImageView被点击了..." ,
                         Toast.LENGTH_SHORT).show();
             }
         });
     }
 
     @Override
     protected void onDestroy() {
         // TODO Auto-generated method stub
         super .onDestroy();
     }
}</span>
内容概要:本文针对火电厂参与直购交易挤占风电上网空间的问题,提出了一种风火打捆参与大用户直购交易的新模式。通过分析可再生能源配额机制下的双边博弈关系,建立了基于动态非合作博弈理论的博弈模型,以直购电价和直购电量为决策变量,实现双方收益均衡最大化。论文论证了纳什均衡的存在性,并提出了基于纳什谈判法的风-火利益分配方法。算例结果表明,该模式能够增加各方收益、促进风电消纳并提高电网灵活性。文中详细介绍了模型构建、成本计算和博弈均衡的实现过程,并通过Python代码复现了模型,包括参数定义、收益函数、纳什均衡求解、利益分配及可视化分析等功能。 适合人群:电力系统研究人员、能源政策制定者、从事电力市场交易的工程师和分析师。 使用场景及目标:①帮助理解风火打捆参与大用户直购交易的博弈机制;②为电力市场设计提供理论依据和技术支持;③评估不同政策(如可再生能源配额)对电力市场的影响;④通过代码实现和可视化工具辅助教学和研究。 其他说明:该研究不仅提供了理论分析,还通过详细的代码实现和算例验证了模型的有效性,为实际应用提供了参考。此外,论文还探讨了不同场景下的敏感性分析,如证书价格、风电比例等对市场结果的影响,进一步丰富了研究内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值