ImageView圖片無限循環(huán)移動

先看一下效果 再貼代碼




自定義屬性:



設(shè)置控件寬高:

左右移動算法:


完整代碼 :

private BitmapmBitmap; //生成位圖

private double startX =0;? ? //移動起始X坐標(biāo)

private int screenWidth;

public static StringTAG ="MoveImageView";

private Timertimer;

private final int orientation;//默認(rèn)向左

private double speed;

public MoveImageView(Context context, AttributeSet attrs) {

super(context, attrs);

? ? if (contextinstanceof AppCompatActivity) {

((AppCompatActivity) (context)).getLifecycle().addObserver(this);

? ? }

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MoveItemView);

? ? orientation = ta.getInt(R.styleable.MoveItemView_orientation, 0);

? ? speed = ta.getFloat(R.styleable.MoveItemView_speed, 0.1f);

? ? Drawable drawable = ta.getDrawable(R.styleable.MoveItemView_img);

? ? if (drawable !=null) {

Bitmap bitmap = drawableToBitamp(drawable);

? ? ? ? setmBitmap(bitmap);

? ? }

ta.recycle();

? ? DisplayMetrics dm = context.getResources().getDisplayMetrics();

? ? screenWidth = dm.widthPixels;

? ? start();

}

private BitmapdrawableToBitamp(Drawable drawable) {

BitmapDrawable bd = (BitmapDrawable) drawable;

? ? Bitmap bitmap = bd.getBitmap();

? ? return bitmap;

}

public void setmBitmap(int res) {

mBitmap = BitmapFactory.decodeResource(getContext().getResources(), res);

}

private void setmBitmap(Bitmap bitmap) {

mBitmap = bitmap;

}

Handlerhandler;

public void start() {

handler =new Handler(Looper.getMainLooper()) {

public void handleMessage(Message msg) {

if (msg.what ==1) {

if (orientation ==0) {

startX -=speed;

? ? ? ? ? ? ? ? }else {

startX +=speed;

? ? ? ? ? ? ? ? }

}

invalidate();

? ? ? ? }

};

? ? timer =new Timer();

? ? timer.schedule(new TimerTask() {

@Override

? ? ? ? public void run() {

handler.removeCallbacksAndMessages(null);

? ? ? ? ? ? handler.sendEmptyMessage(1);

? ? ? ? }

//無延遲窿冯,10毫秒循環(huán)一次土匀。

? ? }, 0, 2);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

? ? if (mBitmap !=null) {

setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight());

? ? }

}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

public void onResume() {

Log.d(TAG, "---onResume---");

? ? if (handler !=null) {

handler.removeCallbacksAndMessages(null);

? ? ? ? handler.sendEmptyMessage(1);

? ? }

}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)

public void onPause() {

Log.d(TAG, "---onPause---");

? ? if (handler !=null) {

handler.removeCallbacksAndMessages(null);

? ? }

}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)

public void onDestroy() {

Log.d(TAG, "---onDestroy---");

? ? if (timer !=null) {

timer.cancel();

? ? }

if (handler !=null) {

handler.removeCallbacksAndMessages(null);

? ? }

}

@Override

public void onDraw(Canvas canvas) {

if (mBitmap !=null) {

if (orientation ==0) {

moveLeft(canvas);

? ? ? ? }else {

moveRight(canvas);

? ? ? ? }

}

}

private void moveLeft(Canvas canvas) {

int page = (int) (Math.abs(startX) +screenWidth) /mBitmap.getWidth();

? ? Log.d(TAG, "size=" + page +" startX=" +startX);

? ? canvas.drawBitmap(mBitmap, (float)startX + (page -1) *mBitmap.getWidth(), 0, null);

? ? canvas.drawBitmap(mBitmap, (float) (startX +mBitmap.getWidth() * page), 0, null);

}

private void moveRight(Canvas canvas) {

int page = (int) (startX /mBitmap.getWidth());

? ? canvas.drawBitmap(mBitmap, (float)startX -mBitmap.getWidth() * page, 0, null);

? ? canvas.drawBitmap(mBitmap, (float)startX -mBitmap.getWidth() * (page +1), 0, null);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崔梗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榕暇,更是在濱河造成了極大的恐慌酪呻,老刑警劉巖挑胸,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杖们,死亡現(xiàn)場離奇詭異,居然都是意外死亡袜腥,警方通過查閱死者的電腦和手機(jī)见擦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門钉汗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鲤屡,你說我怎么就攤上這事损痰。” “怎么了酒来?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵卢未,是天一觀的道長。 經(jīng)常有香客問我堰汉,道長辽社,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任翘鸭,我火速辦了婚禮滴铅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘就乓。我一直安慰自己汉匙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布生蚁。 她就那樣靜靜地躺著噩翠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邦投。 梳的紋絲不亂的頭發(fā)上伤锚,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音尼摹,去河邊找鬼见芹。 笑死剂娄,一個胖子當(dāng)著我的面吹牛蠢涝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阅懦,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼和二,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耳胎?” 一聲冷哼從身側(cè)響起惯吕,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怕午,沒想到半個月后废登,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郁惜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年堡距,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡羽戒,死狀恐怖缤沦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情易稠,我是刑警寧澤缸废,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站驶社,受9級特大地震影響企量,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亡电,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一梁钾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逊抡,春花似錦姆泻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孝凌,卻和暖如春方咆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蟀架。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工瓣赂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人片拍。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓煌集,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捌省。 傳聞我的和親對象是個殘疾皇子苫纤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容