仿新浪微博放大缩小按钮

学习了ObjectAnimator 动画后,实现的控件,继承了Button控件,监听OnTouchListener 处理触摸事件,下面是具体代码


package com.example.touchbutton;

import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

/**
 * 控件点击放大,移动恢复,点击放大消失 ,仿新浪微博按钮控件
 * 
 * @author cy
 * 
 */
@SuppressLint("NewApi") 
public class ScaleButton extends Button {
    // 上一次触摸位置
    private int mLastX, mLastY;
    // 回调接口监听
    private OnClickListener mListener;

    // 标记是否移动,移动后恢复原始大小
    private boolean flag = false;

    public ScaleButton(Context context) {
        super(context, null);
    }

    public ScaleButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            downAnimaotr(); 
            mLastX = (int) event.getX();
            mLastY = (int) event.getY();
            flag = false;
            break;
        case MotionEvent.ACTION_MOVE:
            int curX = (int) event.getX();
            int curY = (int) event.getY();
            if ((Math.abs(curY - mLastY) > 5 || Math.abs(curX - mLastX) > 5)
                    && !flag) {
                moveAnimator();
                flag = true;
            }
            mLastX = curX;
            mLastY = curY;
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            // 如果已经移动恢复原始大小则不执行动画,不回调监听接口
            if(!flag){
                cancelAnimator();
            }
            break;
        }
        return super.onTouchEvent(event);
    }

    /**
     * 按下时执行的动画
     */
    private void downAnimaotr(){
        /**
         * 放大1.5倍
         */
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(this, "ScaleX", 1.5f);
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(this, "ScaleY", 1.5f);
        AnimatorSet animSet = new AnimatorSet();
        animSet.play(anim1).with(anim2);
        animSet.setDuration(300);
        animSet.start();
    }

    /**
     * 移动是执行的动画
     */
    private void moveAnimator(){
        /**
         * 恢复大小动画
         */
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(this, "ScaleX", 1.0f);
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(this, "ScaleY", 1.0f);
        AnimatorSet animSet = new AnimatorSet();
        animSet.play(anim1).with(anim2);
        animSet.setDuration(300);
        animSet.start();
    }

    /**
     * 离开执行动画
     */
    private void cancelAnimator(){
        /**
         * 透明度变为0 ,放大2倍
         */
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(this, "Alpha", 1.0f, 0.0f);
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(this, "ScaleX", 2.0f);
        ObjectAnimator anim3 = ObjectAnimator.ofFloat(this, "ScaleY", 2.0f);
        AnimatorSet animSet = new AnimatorSet();
        animSet.play(anim1).with(anim2);
        animSet.play(anim2).with(anim3);
        animSet.setDuration(300);
        animSet.start();
        // 动画结束监听
        animSet.addListener(new AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                // 回调事件
                if(mListener != null){
                    mListener.onClick(ScaleButton.this);
                }
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }
        });
    }

    /**
     * 设置监听事件
     */
    public void setOnClickListener(OnClickListener listener) {
        this.mListener = listener;
    }

    interface OnClickListener {
        public void onClick(View view);
    }

}

具体的调用activity

package com.example.touchbutton;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.example.touchbutton.ScaleButton.OnClickListener;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((ScaleButton)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "点击事件", Toast.LENGTH_LONG).show();
            }
        }); 

    }

}

不合理的地方,请大家指点修改。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
您可以使用PyQt的QWidget类来创建窗口,并在窗口中添加QPushButton按钮。要使窗口能够放大缩小,请将窗口的大小策略设置为QSizePolicy中的Expanding。以下是一个示例代码,其中包含一个可放大缩小的窗口和两个按钮,分别用于移动和缩放窗口: ```python from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QSizePolicy from PyQt5.QtCore import Qt class MyWindow(QWidget): def __init__(self): super().__init__() # 设置窗口大小策略为Expanding size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setSizePolicy(size_policy) # 创建两个按钮 btn_move = QPushButton("Move", self) btn_move.move(10, 10) btn_scale = QPushButton("Scale", self) btn_scale.move(10, 50) btn_scale.clicked.connect(self.on_scale_clicked) def on_scale_clicked(self): # 点击“Scale”按钮时,设置窗口大小为当前大小的2倍 width = self.width() * 2 height = self.height() * 2 self.resize(width, height) def keyPressEvent(self, event): # 监听键盘事件,当按下左箭头键时,窗口向左移动10个像素 if event.key() == Qt.Key_Left: pos = self.pos() self.move(pos.x() - 10, pos.y()) if __name__ == '__main__': app = QApplication([]) window = MyWindow() window.show() app.exec_() ``` 在这个示例中,我们创建了一个MyWindow类,它继承自QWidget。在__init__方法中,我们将窗口的大小策略设置为Expanding,并创建了两个按钮,一个是用于移动窗口,另一个是用于缩放窗口。当点击“Scale”按钮时,我们将窗口的大小设置为当前大小的2倍。当按下左箭头键时,我们将窗口向左移动10个像素。您可以按照需要修改代码以实现您的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值