Android中动画实现单击按钮控制开屏关屏效果(系统animation实现、scrollTo实现、自定义scrollTo实现)
来源:互联网 发布:奢侈品折扣店知乎 编辑:程序博客网 时间:2024/06/01 09:23
一、不多说,老惯例先上图
二、说明
优点:使用系统的动画,简单方便
缺点:也许大家发现了,按钮只是在效果显示上移动了,但是点击事件并没有跟随着移动(这是个大bug)
三、附上代码BaiHeTestActivity.java
package net.dxs.baihedemo;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class BaiHeTestActivity extends Activity {private LinearLayout layout1;private LinearLayout layout2;private Button button1;private TextView textView1;private TextView textView2;private TextView textView3;private TextView textTest;/** * 菜单面板打开时为true,关闭时为false */private boolean flag = false;private Animation animIn;private Animation animOut;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);layout1 = (LinearLayout) findViewById(R.id.layout1);layout2 = (LinearLayout) findViewById(R.id.layout2);button1 = (Button) findViewById(R.id.button1);textView1 = (TextView) findViewById(R.id.textView1);textView2 = (TextView) findViewById(R.id.textView2);textView3 = (TextView) findViewById(R.id.textView3);textTest = (TextView) findViewById(R.id.textTest);init();}private void init() {animOut = AnimationUtils.loadAnimation(this, R.anim.slide_right_out);animOut.setFillAfter(true);animIn = AnimationUtils.loadAnimation(this, R.anim.slide_right_in);animIn.setFillAfter(true);button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (!flag) {layout2.startAnimation(animOut);} else {layout2.startAnimation(animIn);}flag = !flag;}});textView1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView1.getText());}});textView2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView2.getText());}});textView3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView3.getText());}});}}
四、附上代码布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/layout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/darker_gray" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Large Text1" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="@android:color/black" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Large Text2" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="@android:color/black" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Large Text3" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="@android:color/black" /> </LinearLayout> <LinearLayout android:id="@+id/layout2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/black" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <TextView android:id="@+id/textTest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="textTest" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> </LinearLayout> </FrameLayout></LinearLayout>
四、还有两个animation动画
slide_right_in.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:fillAfter="true" android:duration="800" android:fromXDelta="80%p" android:toXDelta="0" /></set>
slide_right_out.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:fillAfter="true" android:duration="800" android:fromXDelta="0" android:toXDelta="80%p" /></set>
五、scrollTo实现
既然animation动画实现的有bug,那么肯定得换一种方式
方式一:使用scrollTo实现
将layout2.startAnimation(animOut);改为layout2.scrollTo(-200, 0);
layout2.startAnimation(animIn);改为layout2.scrollTo(0, 0);
就可以解决这个bug了,
但是貌似问题又出来了,缓慢移动的效果没有了,
那么我们这个时候就需要引入自定义scrollTo动画了
六、自定义scrollTo实现
①MyScroller.java工具类
package net.dxs.baihedemo;import android.content.Context;import android.os.SystemClock;/** * 位移计算工具类 * @author lijian * */public class MyScroller {private Context ctx;public MyScroller(Context context){ctx = context;}private int startX;private int startY;private int distanceX;private int distanceY;private int currentX;private int currentY;private long startTime;private long duration = 1000L;/** * * @param scrollXx坐标 * @param scrollYy坐标 * @param distanceXX方向移动的距离 * @param distanceYy方向移动的距离 */public void startScroll(int scrollX, int scrollY, int distanceX, int distanceY) {startX = scrollX;startY = scrollY;this.distanceX = distanceX;this.distanceY = distanceY;isFinish = false;startTime = SystemClock.uptimeMillis();}private boolean isFinish ;/** * 计算偏移量, * @return true 还在移动 false:移动已经停止 */public boolean computeScrollOffset() {if (isFinish) {return false;}long timePassed = SystemClock.uptimeMillis()- startTime;if (timePassed < duration) {currentX = (int) (startX + distanceX * timePassed / duration);currentY = (int) (startY + distanceY * timePassed/ duration );System.out.println("currentX:::" + currentX);} else if (timePassed >= duration) {currentX = startX + distanceX;currentY = startY + distanceY;isFinish = true;}return true;}public int getCurrX() {return currentX;}public void setCurrentX(int currentX) {this.currentX = currentX;}public int getCurrentY() {return currentY;}public void setCurrentY(int currentY) {this.currentY = currentY;}}
②调用
定义了一个handler并且回调
package net.dxs.baihedemo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class BaiHeTestActivity extends Activity {private LinearLayout layout1;private LinearLayout layout2;private Button button1;private TextView textView1;private TextView textView2;private TextView textView3;private TextView textTest;/** * 菜单面板打开时为true,关闭时为false */private boolean flag = false;private MyScroller scroller;private final int FLUSH = 1;private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {if(msg.what == FLUSH){if(scroller.computeScrollOffset()){layout2.scrollTo(scroller.getCurrX(), 0);handler.sendEmptyMessage(FLUSH);}}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);layout1 = (LinearLayout) findViewById(R.id.layout1);layout2 = (LinearLayout) findViewById(R.id.layout2);button1 = (Button) findViewById(R.id.button1);textView1 = (TextView) findViewById(R.id.textView1);textView2 = (TextView) findViewById(R.id.textView2);textView3 = (TextView) findViewById(R.id.textView3);textTest = (TextView) findViewById(R.id.textTest);init();}private void init() {scroller = new MyScroller(this);button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (!flag) {scroller.startScroll(layout2.getScrollX(), layout2.getScrollY(), -200, 0);handler.sendEmptyMessage(FLUSH);} else {scroller.startScroll(layout2.getScrollX(), layout2.getScrollY(), 200, 0);handler.sendEmptyMessage(FLUSH);}flag = !flag;}});textView1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView1.getText());}});textView2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView2.getText());}});textView3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView3.getText());}});}}
七、使用系统的Scroller类实现
也许大家会发现我自定义的MyScroller效果不好(匀速移动过去的)
说实话我的这个MyScroller是仿照系统的Scroller写的;
但是我只实现了位移的时间变化,没有去实现速度的时间变化。
那么我们改用系统的Scroller,你会发现移动的效果迅速提升几个等级(开始快,快到的时候放慢了)因为他做了一个速度的时间变化
好了不多说了,代码不用变,只需将MyScroller改为Scroller就ok了
package net.dxs.baihedemo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.Scroller;import android.widget.TextView;public class BaiHeTestActivity extends Activity {private LinearLayout layout1;private LinearLayout layout2;private Button button1;private TextView textView1;private TextView textView2;private TextView textView3;private TextView textTest;/** * 菜单面板打开时为true,关闭时为false */private boolean flag = false;/** * 自定义的scroller *///private MyScroller scroller;/** * 系统的scroller */private Scroller scroller;private final int FLUSH = 1;private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {if(msg.what == FLUSH){if(scroller.computeScrollOffset()){layout2.scrollTo(scroller.getCurrX(), 0);handler.sendEmptyMessage(FLUSH);}}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);layout1 = (LinearLayout) findViewById(R.id.layout1);layout2 = (LinearLayout) findViewById(R.id.layout2);button1 = (Button) findViewById(R.id.button1);textView1 = (TextView) findViewById(R.id.textView1);textView2 = (TextView) findViewById(R.id.textView2);textView3 = (TextView) findViewById(R.id.textView3);textTest = (TextView) findViewById(R.id.textTest);init();}private void init() {//scroller = new MyScroller(this);scroller = new Scroller(this);button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (!flag) {scroller.startScroll(layout2.getScrollX(), layout2.getScrollY(), -200, 0);handler.sendEmptyMessage(FLUSH);} else {scroller.startScroll(layout2.getScrollX(), layout2.getScrollY(), 200, 0);handler.sendEmptyMessage(FLUSH);}flag = !flag;}});textView1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView1.getText());}});textView2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView2.getText());}});textView3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textTest.setText(textView3.getText());}});}}
0 0
- Android中动画实现单击按钮控制开屏关屏效果(系统animation实现、scrollTo实现、自定义scrollTo实现)
- 使用scrollto实现slidemenu
- Android Animation动画效果的实现
- Android animation-list 实现加载动画效果
- android中用animation实现动画效果
- js scrollTo 实现平缓 返回顶部
- Animation动画效果的实现
- Animation动画效果的实现
- Animation动画效果的实现
- Animation动画效果的实现
- Animation动画效果的实现
- Animation动画效果的实现
- Android 自定义Animation实现View摇摆效果
- Android 实现APP开屏广告
- android动画介绍之 自定义Animation动画实现qq抖一抖效果
- Android - ImageButton单击切换按钮图片效果的实现
- Android - ImageButton单击切换按钮图片效果的实现
- Android - ImageButton单击切换按钮图片效果的实现
- 数据库设计三大范式
- C++多态
- 关于线程并发访问全局变量问题
- Thinkphp事务怎么写?
- 参加.Net培训赢得职场好前景
- Android中动画实现单击按钮控制开屏关屏效果(系统animation实现、scrollTo实现、自定义scrollTo实现)
- 常用js验证码
- JavaScript中带HTML注释?
- MFC使用ADO在Oracle中查重
- Linux常用命令大全
- vs开发插件
- php curl_init()
- C++内存地址分配和内存区划分简介
- 发现好东西 开发android的轻量级框架Afinal