日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android 實現自定義圓形listview功能的實例代碼

瀏覽:93日期:2022-09-23 10:40:12

最近遇到一個需求需要圓形listview作為懸浮窗,費了九牛二虎之力終于開發出來了,特別有成就感,下面分享下案例,項目原因,只能分享一部分供大家參考1.有圖有真相

Android 實現自定義圓形listview功能的實例代碼

下面就來講解下代碼:1.自定義listview

import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;public class CircleListView extends ViewGroup { private static final double intervalAngel = 60;//子view之間的間隔角 int circleR;//圓的半徑 int ccx;//圓心的x軸坐標 int ccy;//圓心的y軸坐標 double angel = 0;//偏移角度 private float oldTouchY;//上一次觸摸的y軸位置 private boolean isScrolling = false;//是否在滑動狀態 private Bitmap circleBitmap = null; private Rect src; private Rect dst; private Paint paint; private Adapter adapter = new Adapter(this) { @Override public View getView(int position) { return new View(getContext()); } }; public CircleListView(Context context) { super(context); setWillNotDraw(false); paint = new Paint(); } public CircleListView(Context context, AttributeSet attrs) { super(context, attrs); setWillNotDraw(false); paint = new Paint();// TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CircleListView);// setCircleBitMap(ta.getResourceId(R.styleable.CircleListView_circleDrawable, 0));// ta.recycle(); } private void setCircleBitMap(int drawableId) { if (drawableId != 0) { circleBitmap = BitmapFactory.decodeResource(getResources(), drawableId); } else { circleBitmap = null; } } public void setAdapter(Adapter adapter) { this.adapter = adapter; refreshList(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { measureChildren(widthMeasureSpec, heightMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (circleBitmap != null) { if (src == null) {src = new Rect(); } src.left = 0; src.top = 0; src.right = circleBitmap.getWidth(); src.bottom = circleBitmap.getHeight(); if (dst == null) {dst = new Rect(); } dst.left = ccx - circleBitmap.getWidth()/4; dst.top = ccy - circleBitmap.getHeight()/4; dst.right = ccx + circleBitmap.getWidth()/4; dst.bottom = ccy + circleBitmap.getHeight()/4; canvas.drawBitmap(circleBitmap, src, dst, paint); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { circleR = (getRight() - getLeft()) / 10 * 5; ccy = (int) (getHeight() * 0.5); ccx = getWidth() / 2; for (int i = 0; i < adapter.getCount(); i++) { View childView = getChildAt(i); double childViewAngel = i * intervalAngel + angel; int x = ccx + (int) (Math.sin(Math.toRadians(childViewAngel)) * circleR*0.6); int y = ccy - (int) (Math.cos(Math.toRadians(childViewAngel)) * circleR*0.6); int vl = x - childView.getMeasuredWidth() / 2; int vt = y - childView.getMeasuredHeight() / 2; int vr = x + childView.getMeasuredWidth() / 2; int vb = y + childView.getMeasuredHeight() / 2; childView.layout(vl, vt, vr, vb ); } }// @Override// public boolean dispatchTouchEvent(MotionEvent ev) {// switch (ev.getAction()) {// case MotionEvent.ACTION_DOWN://oldTouchY = ev.getY();//super.dispatchTouchEvent(ev);//return true;// case MotionEvent.ACTION_MOVE://if (!isScrolling && Math.abs(oldTouchY - ev.getY()) > 50) {// isScrolling = true;// float offSetY = 0;// oldTouchY = ev.getY();// angel += offSetY / 20;// requestLayout();// return true;//} else if (isScrolling) {// float offSetY = ev.getY() - oldTouchY;// oldTouchY = ev.getY();// if ((angel + offSetY / 20) < ((adapter.getCount() - 1) * -intervalAngel)) {// angel = (adapter.getCount() - 1) * -intervalAngel;// } else if ((angel + offSetY / 20) > 0) {// angel = 0;// } else {// angel += offSetY / 20;// }// requestLayout();// return true;//}//return super.dispatchTouchEvent(ev);// case MotionEvent.ACTION_UP://boolean notDispatch = isScrolling;//isScrolling = false;//if (notDispatch) {// return false;//} else {// performClick();// return super.dispatchTouchEvent(ev);//}// default://isScrolling = false;//return super.dispatchTouchEvent(ev);// }// } protected void refreshList() { removeAllViews(); for (int i = 0; i < adapter.getCount(); i++) { if (i == 0 && angel < -intervalAngel * (adapter.getCount() - 1)) {angel = -intervalAngel * (adapter.getCount() - 1); } addView(adapter.getView(i)); if (adapter.getCount() == 1) {setPosition(0); } } invalidate(); } protected void setPosition(int position) { angel = -position * intervalAngel; }}

2.實體類

import android.graphics.drawable.Drawable;public class Files { private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getApp_name() { return app_name; } public void setApp_name(String app_name) { this.app_name = app_name; } public String getPackagename() { return packagename; } public void setPackagename(String packagename) { this.packagename = packagename; } public int getImg_bg_id() { return img_bg_id; } public void setImg_bg_id(int img_bg_id) { this.img_bg_id = img_bg_id; } public boolean isShow() { return isShow; } public void setShow(boolean show) { isShow = show; } private Drawable imgDrawable; public Drawable getImgDrawable() { return imgDrawable; } public void setImgDrawable(Drawable imgDrawable) { this.imgDrawable = imgDrawable; } private boolean isShow; private String app_name; private String packagename; private int img_bg_id;}

3.適配器

import android.view.View;import java.util.ArrayList;public abstract class Adapter { private CircleListView circleListView; private ArrayList<Files> allAppList; public Adapter(CircleListView circleListView) { this.circleListView = circleListView; } public int getCount() { return allAppList.size(); } public abstract View getView(int position); public void notifyDataChanged() { circleListView.refreshList(); } public void setPosition(int position) { if (position > getCount() - 1) { position = getCount() - 1; } else if (position < 0) { position = 0; } circleListView.setPosition(position); }}

4.float.xml 引用:

<?xml version='1.0' encoding='utf-8'?><RelativeLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='match_parent'> <ImageView android: android:layout_width='79px' android:layout_height='79px' android:scaleType='fitCenter' android:layout_centerInParent='true' android:background='@drawable/main_selector_floatbtn' android:clickable='true' /> <RelativeLayout android: android:layout_width='300px' android:layout_height='300px' android:layout_centerInParent='true' android:background='@drawable/float_display_bg' android:visibility='gone'> <com.xinrui.headsettest.circlelistview.CircleListView android: android:layout_width='300px' android:layout_height='300px' android:layout_centerHorizontal='true'/> <ImageView android: android:layout_width='70px' android:layout_height='70px' android:scaleType='fitCenter' android:layout_centerInParent='true' android:background='@drawable/float_main_icon' android:clickable='true'/> </RelativeLayout></RelativeLayout>

5.Activity中應用:

import android.app.Activity;import android.os.Bundle;import android.provider.ContactsContract;import android.view.LayoutInflater;import android.view.View;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import com.xinrui.headsettest.circlelistview.Adapter;import com.xinrui.headsettest.circlelistview.CircleListView;import com.xinrui.headsettest.circlelistview.Files;import java.util.ArrayList;public class FloatActivity extends Activity implements View.OnClickListener{ private ImageView floatImg, float_main_img; private RelativeLayout float_area; private CircleListView circle_list_view; private Adapter adapter; private ArrayList<Files> appDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.float_layout); getData(); init(); } private void getData(){ appDataList=new ArrayList<>(); Files files = new Files(); files.setApp_name(this.getResources().getString(R.string.calculator_txt)); files.setImg_bg_id(R.drawable.main_selector_calculator); appDataList.add(files); Files files0 = new Files(); files0.setApp_name(this.getResources().getString(R.string.calendar_txt)); files0.setImg_bg_id(R.drawable.main_selector_calendar); appDataList.add(files0); Files files1 = new Files(); files1.setApp_name(this.getResources().getString(R.string.timer_txt)); files1.setImg_bg_id(R.drawable.main_selector_clock); appDataList.add(files1); Files files2 = new Files(); files2.setApp_name(this.getResources().getString(R.string.vip_txt)); files2.setImg_bg_id(R.drawable.main_selector_vip); appDataList.add(files2); Files files3 = new Files(); files3.setApp_name(this.getResources().getString(R.string.screen_shots_txt)); files3.setImg_bg_id(R.drawable.main_selector_screenshot); appDataList.add(files3); Files files4 = new Files(); files4.setApp_name(this.getResources().getString(R.string.recording_screen_txt)); files4.setImg_bg_id(R.drawable.main_selector_recordingscreen); appDataList.add(files4); } private void init() { float_area = (RelativeLayout) findViewById(R.id.float_area); floatImg = (ImageView) findViewById(R.id.float_btn); float_main_img = (ImageView) findViewById(R.id.float_main_img); float_main_img.bringToFront(); floatImg.setOnClickListener(this); float_main_img.setOnClickListener(this); circle_list_view = findViewById(R.id.circle_list_view); adapter = new Adapter(circle_list_view) { @Override public View getView(final int position) {View view = LayoutInflater.from(FloatActivity.this).inflate(R.layout.item_app,null);TextView app_name = view.findViewById(R.id.app_name);ImageView app_img = view.findViewById(R.id.app_img);ImageView delete_img = view.findViewById(R.id.delete_icon);delete_img.bringToFront();final Files files = appDataList.get(position);app_name.setText(files.getApp_name());app_img.setImageResource(files.getImg_bg_id());if(files.isShow()){ delete_img.setVisibility(View.VISIBLE);}else{ delete_img.setVisibility(View.INVISIBLE);}delete_img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { appDataList.remove(position); Files file = new Files(); file.setShow(false); file.setImg_bg_id(R.drawable.main_selector_additem); file.setApp_name(FloatActivity.this.getResources().getString(R.string.custom_txt)); appDataList.add(position,file); adapter.notifyDataChanged(); }});view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(FloatActivity.this,'my is '+files.getApp_name(),Toast.LENGTH_SHORT).show(); }});view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if(!files.getApp_name().equals(FloatActivity.this.getResources().getString(R.string.custom_txt))) { for (Files file : appDataList) {if (file.getApp_name().equals(files.getApp_name())) { file.setShow(true);} else { file.setShow(false);} } adapter.notifyDataChanged(); } return true; }});return view; } @Override public int getCount() {return appDataList.size(); } }; circle_list_view.setAdapter(adapter); adapter.setPosition(0); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.float_main_img:float_area.setVisibility(View.GONE);floatImg.setVisibility(View.VISIBLE);break; case R.id.float_btn:float_area.setVisibility(View.VISIBLE);floatImg.setVisibility(View.GONE);break; } }}

大功告成就這樣實現了圓形listview…

到此這篇關于Android 實現自定義圓形listview功能的實例代碼的文章就介紹到這了,更多相關android 自定義圓形listview內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
五月天激情综合网| 国产精品尤物| 日韩不卡在线观看日韩不卡视频| 精品久久亚洲| 亚洲精品系列| 成人日韩在线观看| 日韩福利视频一区| 日韩伦理一区| 日本精品在线播放| 亚洲特级毛片| 欧美精品第一区| 首页国产欧美久久| 国产 日韩 欧美一区| 国产精品羞羞答答在线观看| 精品日韩毛片| 精品理论电影在线| 亚洲精品影院在线观看| 欧美丝袜一区| 久久精品系列| 日韩av电影一区| 伊人成人网在线看| 福利精品一区| 色狠狠一区二区三区| 国产一区欧美| 999久久久国产精品| 麻豆国产欧美日韩综合精品二区| 免费一级片91| 久久亚洲在线| 国产精品毛片久久| 国产欧美日韩视频在线| 欧美精品国产一区| 亚洲精品极品| 免费久久99精品国产自在现线| 欧美男人天堂| 国产精品magnet| 日韩中出av| 一本一本久久| 亚洲成人va| 成人精品国产亚洲| 国产精品日本一区二区三区在线| 久久av一区| 亚洲成人av观看| 黄在线观看免费网站ktv| 你懂的国产精品| 国产伦一区二区三区| 日本视频中文字幕一区二区三区| 日韩影院精彩在线| 狠狠爱www人成狠狠爱综合网| 欧产日产国产精品视频| 久久久久免费| sm捆绑调教国产免费网站在线观看 | 欧美日韩精品一本二本三本| 日韩久久电影| 综合日韩av| 国产成人精品一区二区三区视频 | 久久激情av| 青草国产精品久久久久久| 午夜亚洲福利| 日韩在线观看一区二区| 蜜臀av亚洲一区中文字幕| 亚洲一区日韩| 免费在线欧美视频| 亚洲精品护士| 深夜福利一区| 日本成人中文字幕在线视频| 日本免费新一区视频| 国产亚洲一区二区三区不卡| 欧美日韩一区二区三区在线电影| 一区二区国产在线| 日韩欧美三区| 国产乱码精品一区二区三区亚洲人 | 少妇精品久久久一区二区三区| 亚洲有吗中文字幕| 日韩精品免费观看视频| 国产探花在线精品一区二区| 国产精品一国产精品| 久久免费影院| 极品av在线| 美女少妇全过程你懂的久久| 亚洲视频播放| 日韩免费精品| 国产日产一区| 欧美国产中文高清| 日韩欧美午夜| 91久久久久| 自拍自偷一区二区三区| 欧美三级第一页| 久久精品欧洲| 91精品久久久久久久久久不卡| 欧美日韩视频一区二区三区| 快she精品国产999| 91成人在线网站| 红杏一区二区三区| 久久蜜桃精品| 影音先锋久久精品| 国产探花一区| www.九色在线| 亚洲深夜av| 日本麻豆一区二区三区视频| 精品淫伦v久久水蜜桃| 天堂av在线| 国产农村妇女精品一二区| 欧美一级一区| 国产一区二区精品久| 国产a久久精品一区二区三区| 欧美a在线观看| 国产不卡精品在线| 久久久国产精品一区二区中文| 99久久夜色精品国产亚洲狼| 免费不卡中文字幕在线| 亚洲一区二区网站| 亚洲欧洲av| 国产激情综合| 日韩在线看片| 亚洲深夜福利| 亚洲开心激情| 日韩欧美中文字幕电影| 国产精品白浆| 高清日韩欧美| 美女网站一区| 蜜桃一区二区三区在线| 欧美亚洲自偷自偷| 福利一区视频| 图片区亚洲欧美小说区| 亚洲97av| 国产一区二区三区久久| 久久理论电影| 午夜日韩影院| 精品成av人一区二区三区 | 精品在线91| 人人精品久久| 国产亚洲一区二区手机在线观看| 亚洲精品影视| 欧洲亚洲一区二区三区| 日韩精品中文字幕吗一区二区| 色偷偷偷在线视频播放| 一级成人国产| 91精品韩国| 国产精品中文| 久久福利影视| 日韩电影免费网址| 日韩国产在线一| 免费av一区二区三区四区| 免费一区二区三区在线视频| 国产日韩专区| 国产传媒在线| 日韩av在线免费观看不卡| 欧美精品羞羞答答| 精品女同一区二区三区在线观看| 亚洲专区视频| 欧美1区2区3区| 精品精品99| 亚洲日本在线观看视频| 精品久久视频| 欧美一区网站| 首页国产欧美久久| 999久久久精品国产| 你懂的国产精品| 亚洲精品美女91| 久久精品播放| 精品中文在线| 久久狠狠久久| 亚洲一区二区三区中文字幕在线观看| 日本欧美不卡| 丁香婷婷久久| 国产欧美日韩在线观看视频 | 中日韩男男gay无套| 欧美少妇精品| 久久亚洲国产精品尤物| 欧美在线看片| 亚洲性视频在线| 国产视频一区在线观看一区免费| 国产a亚洲精品| 国产精品天天看天天狠| 日韩精品1区2区3区| 亚洲视频二区| 丝袜美腿成人在线| 狠狠爱成人网| 久久精品免费一区二区三区| 国产伊人久久| 欧美激情亚洲| 国产精品亚洲四区在线观看 | 日韩在线观看一区二区三区| 午夜精品亚洲| 黄在线观看免费网站ktv| 欧美激情 亚洲a∨综合| 国产日韩中文在线中文字幕 | 欧美亚洲网站| 日韩精品国产精品| 色综合视频一区二区三区日韩| 香蕉精品999视频一区二区| 成人av二区| 日本免费在线视频不卡一不卡二| 亚洲精品精选| 日韩有吗在线观看| 午夜一区在线| 丝袜美腿高跟呻吟高潮一区| 国产视频欧美| 丝袜亚洲精品中文字幕一区| 欧美综合另类|