Just a simple imitation, remember, in case you want to use later. Also needs to be perfected
The main control is on this side.
http://blog.csdn.net/lcq5211314123/article/details/48810121
However, here is the bottom button of the demo download
The address of the link is wrong, it is a pull-down, so you can only copy the code.
The most annoying use of this custom attribute is that r.styleable in XML is cumbersome, so just sort it out.
By the way, change the control to three lines, because this is the place.
package view;import android.content.context;import android.content.res.typedarray;import Android.graphics.bitmap;import android.graphics.bitmapfactory;import android.graphics.canvas;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.displaymetrics;import android.view.view;import android.view.windowmanager;import com.example.dragrelativelayout.r;/** * Imitation Guevara app background automatically move view * original this way: http://blog.csdn.net/ lcq5211314123/article/details/48810121 */public class guevaraview extends view { /** Mask Layer Transparency percentage */private float malpha = 0.5f;/** the speed of the loop movement */private float mspeed = 4;/** background */private bitmap mbackground0, mbackground1 ,mbackground2;private of cyclic movement Context mContext;/** screen width */private int screenwidth;/** The horizontal */private of the first row and two carousel graphs float x00, x01;/** the horizontal axis of the second row of two carousel plots */private float x10, x11;/** the horizontal */private float x20 of the third row and two carousel plots, x21;private int mBgWidth0, mBgHeight0;private int mBgWidth1, mBgHeight1; private int mbgwidth2, mbgheight2;private handler mhandler = new Handler () {public void handlemessage (message msg) {x00 -= mspeed;x01 - = mspeed;x10 += mspeed;x11 += mspeed;x20 -= mspeed;x21 -= mspeed; if (X00 <= -mbgwidth0) {// move the first one back to the second one X00 = x01 + mbgwidth0;} if (X01 <= -mbgwidth0) {// move the second one to the back of the first X01 = x00 + mbgwidth0;} if (X10 >= screenwidth) {x10 = x11 - mbgwidth1;} if (X11 >= screenwidth) {x11 = x10 - mbgwidth1;} if (x20 <= -mbgwidth2) {// The first one moves to the second sheet behind X20 = x21 + mbgwidth2;} if (x21 <= -mbgwidth2) {// move the second one to the back of the first x21 = x20 + mbgwidth2;} Invalidate (); mhandler.sendemptymessagedelayed (0, 100);};}; Public guevaraview (Context context) {super (Context); mcontext = context;} Public guevaraview (context context, attributeset attrs) {super (context, attrs); Mcontext = context;} Public void create () {if (mbackground0 == null ) mbackground0 = Bitmapfactory.decoderesource (Getresources (), R.DRAWABLE.AA); if (mbackground1 == null) mBackground1 = bitmapfactory.decoderesource (Getresources (), r.drawable.bb); if (mbackground2 == null) Mbackground2 = bitmapfactory.decoderesource (Getresources (), r.drawable.cc);D ISPLAYMETRICS&NBSP;DM = new displaymetrics (); windowmanager wm = (WindowManager) mcontext.getsystemservicE (Context.window_service); Wm.getdefaultdisplay (). Getmetrics (DM);screenwidth = dm.widthpixels; Mbgwidth0 = mbackground0.getwidth (); Mbgwidth1 = mbackground1.getwidth (); mBgWidth2 = mbackground2.getwidth (); Mbgheight0 = mbackground0.getheight ();mbgheight1 = Mbackground1.getheight (); Mbgheight2 = mbackground2.getheight ();x00 = 0;x01 = Mbgwidth0;x10 = screenwidth - mbgwidth1;x11 = screenwidth - mbgwidth1 - mbgwidth1;x20 = 0;x21 = mbgwidth2;mhandler.sendemptymessagedelayed (0, 0) ;} Public void start () {mhandler.sendemptymessagedelayed (0, 0);} Public void stop () {mhandler.removemessages (0);} Public boolean isstop () {return !mhandler.hasmessages (0);} @Overrideprotected void onmeasure (Int widthmeasurespec, int heightmeasurespec) { /** * specifies that the width of the view is the screen width and height is the background height. &Nbsp;*/int viewheight = mbgheight0 +mbgheight1 +mbgheight2 + getpaddingtop ( ) + getpaddingbottom (); setmeasureddimension (screenwidth, viewheight);} @Overrideprotected void ondraw (Canvas canvas) {/** * draw two background maps */ Canvas.drawbitmap (Mbackground0, x00, 0, null); Canvas.drawbitmap (MBackground0, x01, 0, null); Canvas.drawbitmap (mbackground1, x10, mbgheight0, null); Canvas.drawBitmap ( Mbackground1, x11, mbgheight0, null); Canvas.drawbitmap (mbackground2, x20, mbgheight0+ Mbgheight1, null); Canvas.drawbitmap (mbackground2, x21, mbgheight0+mbgheight1, null);/** * Draw Mask Layer */canvas.drawargb ((int) (malpha * 255), 0, 0, 0);} @Overrideprotected void ondetachedfromwindow () {// destroy Super.ondetachedfromwindow () upon exit; Mbackground0 = null;mbackground1 = null;mbackground2 = null;} /** Matte Layer Transparency Percentage */public void setalpha (Float malpha) {This.malpha = malpha;} /** the speed of the Loop movement */public void setspeed (float mspeed) {this.mspeed = mspeed;} Public void setdrawable (INT&NBSP;ID0&NBSP;,INT&NBSP;ID1&NBSP;,INT&NBSP;ID2) {mBackground0 = bitmapfactory.decoderesource (Getresources (), id0); Mbackground1 = bitmapfactory.decoderesource ( Getresources (), ID1); Mbackground2 = bitmapfactory.decoderesource (Getresources (), ID2);}}
Try it, no problem, can run.
Directly with someone else's blog demo, add this to the.
You can download the http://down.51cto.com/data/2219589 here.
This article is from the "Fly to learn Android" blog, please be sure to keep this source http://qq445493481.blog.51cto.com/9545543/1782612
Imitation tile @ Movie Android Personal center background Loop Motion diagram