English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Recently, a new requirement has emerged, a floating layer appears on the page and is clickable, the code implementation is as follows:
Implement floating layer images in Activity:
@Override public void onResume() { super.onResume(); createView(); } @Override public void onPause() { super.onPause(); / Destroy the floating window when the program exits (Activity destroyed) if(floatView!=null && windowManager !=null) { windowManager.removeView(floatView); floatView=null; windowManager = null; windowManagerParams = null; }} private void createView() { if(floatView!=null) return ; CmsAPI cmsAPI = RestAdapterUtils.getRestAPI(Config.NEW_CMS_URL, CmsAPI.class, this); cmsAPI.getFloatingAd(new Callback<AdFloating>() {// Request data @Override public void success(AdFloating adFloating, Response response) { if (adFloating != null && "0".equals(adFloating.getErrorCode())) { long startTime = adFloating.getStarttime(); long endTime = adFloating.getEndtime(); long currentTime = System.currentTimeMillis(); // LOGD(startTime + " +++++ "+endTime +" "+currentTime +" "+(currentTime > startTime && currentTime < endTime)); if (currentTime > startTime && currentTime < endTime) {//Periodo di validità dell'attività floatView = new FloatView(getApplicationContext()); floatView.setOnClickListener(MainActivity.this); int height = 240; int width = 110; float ratio= 1.35f; if (!TextUtils.isEmpty(adFloating.getImg2())) { try { height = Integer.parseInt(adFloating.getImg2h()); width = Integer.parseInt(adFloating.getImg2w()); ratio = (float) width / height; } catch (Exception e) { ratio = 1.35f; } } // floatView.setAspectRatio(ratio);//Dimensione dell'immagine floatView.setImageURI(Uri.parse(adFloating.getImg2()));//Imposta l'indirizzo di immagine della rete // floatView.setImageResource(R.drawable.face_icon); // Utilizza semplicemente l'icona predefinita per l'esempio // Ottieni WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); // Imposta i parametri relativi a LayoutParams (variabile globale) windowManagerParams = ((MiGuApplication) getApplication()).getWindowParams(); windowManagerParams.type = WindowManager.LayoutParams.TYPE_PHONE; // Imposta il tipo di finestra windowManagerParams.format = PixelFormat.RGBA_8888; // Imposta il formato dell'immagine, con effetto di sfondo trasparente // Imposta il flag della finestra windowManagerParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; /* * Attenzione, il valore di flag può essere: * LayoutParams.FLAG_NOT_TOUCH_MODAL non influisce sugli eventi successivi * LayoutParams.FLAG_NOT_FOCUSABLE non focusabile * LayoutParams.FLAG_NOT_TOUCHABLE non touchabile */ // Adatta la finestra fluttuante all'angolo in alto a sinistra per facilitare l'adattamento delle coordinate windowManagerParams.gravity = Gravity.LEFT | Gravity.TOP; // Imposta i valori iniziali x, y con l'angolo in alto a sinistra dello schermo come origine DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int screenWidth = dm.widthPixels; int screenHeigh = dm.heightPixels; int x = screenWidth - SystemTools.dip2px(MainActivity.this, 100); int y = screenHeigh - SystemTools.dip2px(MainActivity.this, 200); windowManagerParams.x = x; windowManagerParams.y = y; // Imposta i dati di lunghezza e larghezza della finestra fluttuante windowManagerParams.width = width; // Imposta la larghezza della finestra in base alla dimensione dell'immagine windowManagerParams.height = height; // Imposta l'altezza della finestra in base alla dimensione dell'immagine // windowManagerParams.width = WindowManager.LayoutParams.WRAP_CONTENT; // windowManagerParams.height = WindowManager.LayoutParams.WRAP_CONTENT; // 显示myFloatView图像 windowManager.addView(floatView, windowManagerParams); return; } } } @Override public void failure(RetrofitError error) { // 网络请求数据失败 LOGE(error.getMessage()); } }); } public void onClick(View v) { // 图片的点击事件 Intent intent = new Intent(MainActivity.this, ActivitiesDetails.class); startActivity(intent); }
图片控件:
public class FloatView extends SimpleDraweeView { private float mTouchX; private float mTouchY; private float x; private float y; private float mStartX; private float mStartY; private OnClickListener mClickListener; private WindowManager windowManager = (WindowManager) getContext(); .getApplicationContext().getSystemService(Context.WINDOW_SERVICE); // 此windowManagerParams变量为获取的全局变量,用以保存悬浮窗口的属性 private WindowManager.LayoutParams windowManagerParams = ((MiGuApplication) getContext()) .getApplicationContext()).getWindowParams(); public FloatView(Context context) { super(context); } public FloatView(Context context, AttributeSet attrs) { super(context, attrs); } private long curtime=0; @Override public boolean onTouchEvent(MotionEvent event) { // Ottieni l'altezza della barra di stato Rect frame = new Rect(); getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; System.out.println("statusBarHeight:"+statusBarHeight); // Ottieni le coordinate relative al schermo, ovvero con l'angolo in alto a sinistra dello schermo come origine x = event.getRawX(); y = event.getRawY() - statusBarHeight; // statusBarHeight è l'altezza della barra di stato del sistema switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // Cattura l'azione di tocco del dito premuto // Ottieni le coordinate relative al View, ovvero con questo View in alto a sinistra come origine mTouchX = event.getX(); mTouchY = event.getY(); mStartX = x; mStartY = y; break; case MotionEvent.ACTION_MOVE: // Cattura l'azione di movimento del dito updateViewPosition(); curtime=System.currentTimeMillis(); break; case MotionEvent.ACTION_UP: // Cattura l'azione di tocco del dito lontano // if(System.currentTimeMillis()-curtime>100){ // break; // } updateViewPosition(); mTouchX = mTouchY = 0; if (Math.abs(x - mStartX) < 5 && Math.abs(y - mStartY) < 5) { // Spostamento leggero considerato come click if(mClickListener!=null) { mClickListener.onClick(this); } } break; } return true; } @Override public void setOnClickListener(OnClickListener l) { this.mClickListener = l; } private void updateViewPosition() { // Aggiorna i parametri di posizione della finestra fluttuante windowManagerParams.x = (int) (x - mTouchX); windowManagerParams.y = (int) (y - mTouchY); windowManager.updateViewLayout(this, windowManagerParams); // Aggiorna la visualizzazione } }
Questo è tutto il contenuto dell'articolo, spero che sia utile per la tua apprendimento, e spero che tutti supportino il tutorial urla.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è di proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.