米拉的Android

知识点总结

2019-06-10  本文已影响0人  老米拉

知识点总结

Android

View

public void layout(int l,int t,int r, int b)
{
    super.layout(l,t,r+100,b+100);
}
if(widthMeasureSpec == MeasureSpec.AT_MOST 
    && heightMeasureSpec == MeasureSpec.AT_MOST)
{
    setMeasuredDimension(200,200); // wrap_content情况下要设置一个默认值,200只是举个例子,最终的值需要计算得到刚好包裹内容的宽高值
} 
else if(widthMeasureSpec == MeasureSpec.AT_MOST)
{
    setMeasuredDimension(200,heightMeasureSpec );
}
else if(heightMeasureSpec == MeasureSpec.AT_MOST)
{
    setMeasuredDimension(heightMeasureSpec ,200);
}

面试常问基础

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="com.smilexie.test.intent.mybroadcastreceiver"/>
    </intent-filter>
</receiver>
  1. 动态注册:动态注册的广播接收者只有执行了registerReceiver(receiver, filter)才会开始监听广播消息,并对广播消息作为相应的处理。
IntentFilter fiter = new IntentFilter("com.smilexie.test.intent.mybroadcastreceiver");
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
registerReceiver(receiver, filter);

//撤销广播接受者的动态注册

unregisterReceiver(receiver);

Android源码相关面试专题

a) ValueAnimator.ofInt(int values) // 估值器是整型估值器IntEaluator
b) ValueAnimator.ofFloat(float values) // 估值器是浮点型估值器FloatEaluator
c) ValueAnimator.ofObject(ObjectEvaluator, start, end) // 将初始值以对象的形式过渡到结束值,通过操作对象实现动画效果,需要实现Interpolator接口,自定义估值器
```

// 自定义估值器,需要实现TypeEvaluator接口
public class ObjectEvaluator implements TypeEvaluator{
// 复写evaluate(),在evaluate()里写入对象动画过渡的逻辑
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
// 参数说明
// fraction:表示动画完成度(根据它来计算当前动画的值)
// startValue、endValue:动画的初始值和结束值

    ... // 写入对象动画过渡的逻辑
    
    return value;  
    // 返回对象动画过渡的逻辑计算后的值
} 
```

如果采用ObjectAnimator类实现动画,操作的对象的属性必须有get()和set()方法。
其他用法:
AnimatorSet组合动画
AnimatorSet.play(Animator anim) // 播放当前动画 AnimatorSet.after(long delay) // 将现有动画延迟x毫秒后执行 AnimatorSet.with(Animator anim) // 将现有动画和传入的动画同时执行 AnimatorSet.after(Animator anim) // 将现有动画插入到传入的动画之后执行 AnimatorSet.before(Animator anim) // 将现有动画插入到传入的动画之前执行

View.animate().alpha(0f).x(500).y(500).setDuration(500).setInterpolator()
Animation.addListener(new AnimatorListener() {
          @Override
          public void onAnimationStart(Animation animation) {
              //动画开始时执行
          }
          
           @Override
          public void onAnimationRepeat(Animation animation) {
              //动画重复时执行
          }
          
         @Override
          public void onAnimationCancel()(Animation animation) {
              //动画取消时执行
          }
          
          @Override
          public void onAnimationEnd(Animation animation) {
              //动画结束时执行
          }
      });
dispatchDraw() 
{ 
.... 
Animation a = ChildView.getAnimation() 
Transformation tm = a.getTransformation(); 
Use tm to set ChildView's Canvas; 
Invalidate(); 
.... 
}

public void dispatchInvalidateDelayed(View view, long delayMilliseconds) {
Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view);
mHandler.sendMessageDelayed(msg, delayMilliseconds);
}
```
这里的mHandler是ViewRootHandler实例,在该Handler的handleMessage方法中调用了view.invalidate()方法。

case MSG_INVALIDATE:
                    ((View) msg.obj).invalidate();
                    break;

Android面试帮助篇

7、Down事件到来时,如果一个View没有消费该事件,那么后续的MOVE/UP事件都不会再给它

后台开发

设计模式

上一篇 下一篇

猜你喜欢

热点阅读