自定义组件ParallaxImageView
效果图如下:
关键API:canvas.translate(float dx, float dy),想要慢慢的移动图片,其实就是移动画布的一个过程,因为图片就是画在画布(Canvas)上面的。
Android View的坐标系:
(0,0)-------------------->(x最大,0)
|
|
|
|
|
|
|
|
|
|
(y最大,0)
- ParallaxImageView类代码:
public class ParallaxImageView extends ImageView {
private int mCurrentTranslation;
public ParallaxImageView(Context context) {
super(context);
}
public ParallaxImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ParallaxImageView(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setCurrentTranslation(int translation){
this.mCurrentTranslation = translation;
invalidate();
}
@Override
public void onDraw(Canvas canvas){
canvas.save();
canvas.translate(0, -mCurrentTranslation / 2);
super.onDraw(canvas);
canvas.restore();
}
}
- 最后我们在MainActivity中使用Handler不断的post这个设置translation值的任务就行了:
private Handler mHandler = new Handler();
private int translation = 0;
private final Runnable mTranslateRunnable = new Runnable(){
@Override
public void run() {
mImageView.setCurrentTranslation((translation++) % 100);
mHandler.postDelayed(this, 100);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ParallaxImageView)
findViewById(R.id.parallaxImageView1);
mHandler.postDelayed(mTranslateRunnable, 300);
}