色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android實(shí)現(xiàn)懸浮圖片

瀏覽:2日期:2022-09-22 15:38:37

本文實(shí)例為大家分享了Android實(shí)現(xiàn)懸浮圖片的具體代碼,供大家參考,具體內(nèi)容如下

@SuppressLint('AppCompatCustomView')public class MoveImageView extends ImageView { //按下那一刻的坐標(biāo)和 控件上下左右距離 private float lastX; private float lastY; private int left; private int top; private int right; private int bottom; //如果是拖動(dòng)事件就不用響應(yīng)點(diǎn)擊事件 boolean isMove = false; boolean isAnimatoring = false; //屏幕寬高 private int screenWidthPx; private int screenHeightPx; public MoveImageView(Context context) { this(context, null); } public MoveImageView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public MoveImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); screenWidthPx = getScreenWidthPx(getContext()); screenHeightPx = getScreenHeightPx(getContext()); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //動(dòng)畫(huà)執(zhí)行過(guò)程中,不響應(yīng)一切操作, // 這里相當(dāng)于不讓其走后面的MotionEvent.ACTION_MOVE:與MotionEvent.ACTION_UP: if (isAnimatoring) { return false; } lastX = event.getRawX(); lastY = event.getRawY(); left = getLeft(); top = getTop(); right = getRight(); bottom = getBottom(); break; case MotionEvent.ACTION_MOVE: isMove = true; float x = event.getRawX(); float y = event.getRawY(); int l = (int) (left + (x - lastX)); int t = (int) (top + (y - lastY)); int r = (int) (right + (x - lastX)); int b = (int) (bottom + (y - lastY)); layout(l, t, r, b); break; case MotionEvent.ACTION_UP: if (isMove) { //如果頂部拖出屏幕外面,回正 if (getTop() < 0) { layout(getLeft(), 0, getRight(), getHeight()); } //getBottom() 獲取到的是 控件底部到父容器頂部的距離,所以需要減去狀態(tài)欄的高度 int bottomHeight = screenHeightPx - getStatusBarHeight(getContext()); //如果底部拖出屏幕外面,回正 if (getBottom() > bottomHeight) { layout(getLeft(), bottomHeight-getHeight(), getRight(), bottomHeight); } isMove = false; startAnimation(); return true; } return super.onTouchEvent(event); } return super.onTouchEvent(event); } private void startAnimation() { isAnimatoring = true; //右邊距 int marinRight = DisplayUtils.dpToPx(20); int endValue = screenWidthPx - marinRight; ValueAnimator animator = ValueAnimator.ofInt(getRight(), endValue); animator.setDuration(Math.abs(endValue - getRight()) > 1000 ? 1000 : Math.abs(endValue - getRight())); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int curValue = (int) animation.getAnimatedValue(); layout(curValue - getWidth(), getTop(), curValue, getHeight() + getTop()); } }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { isAnimatoring = false; animator.removeAllUpdateListeners(); animator.removeAllListeners(); } }); animator.start(); } /** * 獲取狀態(tài)欄高度 */ public static int getStatusBarHeight(Context context) { int result = 24; int resId = context.getResources().getIdentifier('status_bar_height', 'dimen', 'android'); if (resId > 0) { result = context.getResources().getDimensionPixelSize(resId); } else { result = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, result, Resources.getSystem().getDisplayMetrics()); } return result; } public static int getScreenWidthPx(Context context) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); if (windowManager != null) {// windowManager.getDefaultDisplay().getMetrics(dm); windowManager.getDefaultDisplay().getRealMetrics(dm); return dm.widthPixels; } return 0; } public static int getScreenHeightPx(Context context) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); if (windowManager != null) {// windowManager.getDefaultDisplay().getMetrics(dm); windowManager.getDefaultDisplay().getRealMetrics(dm); return dm.heightPixels; } return 0; }}

應(yīng)用:

布局文件:

<?xml version='1.0' encoding='utf-8'?><RelativeLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' tools:context='.TestActivity'> <com.lingtao.ltvideo.widgets.MoveImageView android:layout_width='50dp' android: android:layout_height='50dp' android:layout_alignParentRight='true' android:layout_alignParentBottom='true' android:layout_marginBottom='100dp' android:layout_marginRight='20dp' android:src='http://www.lshqa.cn/bcjs/9076.html#ff0000' /></RelativeLayout>

Activity:

public class TestActivity extends AppCompatActivity { private MoveImageView moveImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test2); moveImageView = ((MoveImageView) findViewById(R.id.MoveImageView)); moveImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(TestActivity.this, '點(diǎn)擊事件', Toast.LENGTH_SHORT).show(); } }); }}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 亚洲一区二区三区一品精 | 国产激情视频在线播放 | 一区二区视频在线 | 成人手机视频在线观看 | 欧美黄色xxx | 天干天干天啪啪夜爽爽色 | 久国产精品视频 | 亚洲精品人成网在线播放影院 | 国产成a人片在线观看视频 国产成版人视频网站免费下 | 日韩精品视频美在线精品视频 | 毛片免费视频观看 | 久久成年人 | 亚洲第一在线 | 美女黄网站色一级毛片 | 夜色视频一区二区三区 | 成人精品网 | 免费观看a黄一级视频 | 美女视频很黄很a免费国产 美女视频黄.免费网址 | 美女张开腿让男人桶爽免费网站 | 无限观看社区在线视频 | 日韩一区二区视频在线观看 | 狠狠综合久久久综合 | 真人毛片免费全部播放完整 | 久久99精品视频 | 鸥美毛片| 久久草在线视频 | 亚洲欧美日韩中文字幕在线一区 | 伊人久久在线 | 久久中文字幕日韩精品 | 在线不卡一区二区 | 国产综合精品在线 | 色婷婷色综合激情国产日韩 | 精品国产美女福到在线不卡f | 午夜性色福利视频在线视频 | 一级在线 | 欧洲 | 日韩精品一区二区三区在线观看 | 免费永久观看美女视频网站网址 | 精品一区二区三区免费毛片爱 | 国产无毛 | 作爱在线观看 | 欧美精品1 |