像android tv中很多应用一样,焦点在控件上的时候,控件放大,失去焦点时,控件还原。

小小的实现一个简单的demo。

public class ScaleRunnable implements Runnable {private static int ZOOM_ANIMATION_DURATION = 200;private final View mView;private float mStartScale;private float mTargetScale;private long mStartTime;private int scaleAnimTime;private Boolean mIsRun = false;//Boolean是包装类型,boolean是基本类型private Boolean mStop;private Boolean mZoomIn;private float mVelocity;private onScaleEndListen monScaleEndListen;ScaleRunnable(View view){this(view, ZOOM_ANIMATION_DURATION);//构造函数不能直接调用}public ScaleRunnable(View view, int Animtime) {// TODO Auto-generated constructor stubmView = view;scaleAnimTime = Animtime;}public void setOnScaleEndListen(onScaleEndListen l){monScaleEndListen = l;}public void start(float startScale, float targetScale){if(mIsRun){return;}mStartScale = startScale;mTargetScale = targetScale;mVelocity = (mTargetScale - mStartScale)/scaleAnimTime;mZoomIn = (mTargetScale > mStartScale) ? true:false;mStartTime = System.currentTimeMillis();mStop = false;mIsRun = true;mView.post(this);//在ui线程中运行,会调用run()函数}public void stop(){mStop = true;mIsRun = false;mView.buildDrawingCache();}@Overridepublic void run() {// TODO Auto-generated method stubsif(mStop){return;}long time = System.currentTimeMillis();long elapsed = time - mStartTime;float newScale = mStartScale + elapsed * mVelocity;if(newScale == mTargetScale || (mZoomIn == (newScale > mTargetScale))){mView.setScaleX(mTargetScale);mView.setScaleY(mTargetScale);if(null != monScaleEndListen){monScaleEndListen.onScaleEnd();}stop();}else{mView.setScaleX(newScale);mView.setScaleY(newScale);}if (!mStop) {mView.post(this);//在放大没完成时,继续放大}}public static interface onScaleEndListen{public void onScaleEnd();}}
ScaleRunnable继承自Runnable,在run()中缩放view


在MainActivity中,

public class MainActivity extends Activity implements OnClickListener{private Button mBtnA;private Button mBtnB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mBtnA = (Button)findViewById(R.id.btn_a);mBtnA.setOnClickListener(this);mBtnA.setOnFocusChangeListener(new OnFocusChangeListener() {@Overridepublic void onFocusChange(View arg0, boolean arg1) {// TODO Auto-generated method stubScaleRunnable scale = new ScaleRunnable(mBtnA);scale.setOnScaleEndListen(new onScaleEndListen(){@Overridepublic void onScaleEnd() {// TODO Auto-generated method stubLog.i("TAG", "ScaleSucceed A");}});if(arg1){Log.i("TAG", "mBtnA focus");scale.start(1.0f, 1.5f);}else{Log.i("TAG", "mBtnA lost focus");scale.start(1.5f, 1.0f);}}});mBtnB = (Button)findViewById(R.id.btn_b);mBtnB.setOnFocusChangeListener(new OnFocusChangeListener() {@Overridepublic void onFocusChange(View arg0, boolean arg1) {// TODO Auto-generated method stubScaleRunnable scale = new ScaleRunnable(mBtnB);scale.setOnScaleEndListen(new onScaleEndListen(){@Overridepublic void onScaleEnd() {// TODO Auto-generated method stubLog.i("TAG", "ScaleSucceed B");}});if(arg1){Log.i("TAG", "mBtnB focus");scale.start(1.0f, 1.5f);}else{Log.i("TAG", "mBtnB lost focus");scale.start(1.5f, 1.0f);}}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubreturn super.onOptionsItemSelected(item);}}
就可实现放大缩小的效果。


更多相关文章

  1. C语言函数的递归(上)
  2. Activity之SharedPreferences探究
  3. Android(安卓)SDK 之uiautomatorviewer工具的使用
  4. android Audio设置音量流程及其binder通讯原理
  5. Android动画类型
  6. android listview使用glide异步加载图片错位,闪烁问题
  7. LocalBroadcastManager原理解析
  8. Android学习-常见的UI控件 RadioGroup和RadioButton
  9. Android动作广播类别消息类型

随机推荐

  1. android:layout_weight的真实含义
  2. ScrollView属性fillViewport解决android
  3. 将Android封装库通过gradle部署到maven私
  4. Android: 3G/1G and 2G/2G kernels probl
  5. android 远程接口
  6. Android第四十四期 - 登录界面的动画
  7. 【android】Android(安卓)Studio2.3打包
  8. Android(安卓)studio嵌入二维码扫描
  9. Android一次刷机
  10. [4.18]Android生命周期介绍