當前位置:首頁 » 安卓系統 » android彈出窗口

android彈出窗口

發布時間: 2024-12-22 17:16:22

A. android使用百度地圖3.0版本怎樣實現自定義彈出窗口功能

基本原理就是用ItemizedOverlay來添加附加物,在OnTap方法中向MapView上添加一個自定義的View(如果已存在就直接設為可見),下面具體來介紹我的實現方法:


一、自定義覆蓋物類:MyPopupOverlay,這個類是最關鍵的一個類ItemizedOverlay,用於設置Marker,並定義Marker的點擊事件,彈出窗口,至於彈出窗口的內容,則通過定義Listener,放到Activity中去構造。如果沒有特殊需求,這個類不需要做什麼改動。代碼如下,popupLinear這個對象,就是加到地圖上的自定義View:

java"><OverlayItem>{
privateContextcontext=null;
//這是彈出窗口,包括內容部分還有下面那個小三角
=null;
//這是彈出窗口的內容部分
private
ViewpopupView=null;
privateMapViewmapView=null;
private
Projectionprojection=null;
//這是彈出窗口內容部分使用的layoutId,在Activity中設置
privateintlayoutId=
0;
//是否使用網路帶有A-J字樣的Marker
=
false;
privateint[]defaultMarkerIds={
R.drawable.icon_marka,
R.drawable.icon_markb,
R.drawable.icon_markc,
R.drawable.icon_markd,
R.drawable.icon_marke,
R.drawable.icon_markf,
R.drawable.icon_markg,
R.drawable.icon_markh,
R.drawable.icon_marki,
R.drawable.icon_markj,};
//這個Listener用於在Marker被點擊時讓Activity填充PopupView的內容
private
OnTapListeneronTapListener=null;
publicMyPopupOverlay(Contextcontext,Drawablemarker,MapViewmMapView)
{
super(marker,mMapView);
this.context=
context;
this.popupLinear=newLinearLayout(context);
this.mapView=mMapView;
popupLinear.setOrientation(LinearLayout.VERTICAL);
popupLinear.setVisibility(View.GONE);
projection=
mapView.getProjection();
}
@Override
publicbooleanonTap(GeoPointpt,MapViewmMapView)
{
//點擊窗口以外的區域時,當前窗口關閉
if(popupLinear!=null&&
popupLinear.getVisibility()==View.VISIBLE){
LayoutParamslp=
(LayoutParams)popupLinear.getLayoutParams();
PointtapP=new
Point();
projection.toPixels(pt,tapP);
PointpopP
=newPoint();
projection.toPixels(lp.point,
popP);
intxMin=popP.x-lp.width/2+lp.x;
intyMin=popP.y-lp.height+lp.y;
intxMax=popP.x+
lp.width/2+lp.x;
intyMax=popP.y+lp.y;
if
(tapP.x<xMin||tapP.y<yMin||tapP.x>xMax
||tapP.y>yMax)
popupLinear.setVisibility(View.GONE);
}
return
false;
}
@Override
protectedbooleanonTap(inti){
//
點擊Marker時,該Marker滑動到地圖中央偏下的位置,並顯示Popup窗口
OverlayItemitem=
getItem(i);
if(popupView==null){
//
如果popupView還沒有創建,則構造popupLinear
if
(!createPopupView()){
returntrue;
}
}
if(onTapListener==null)
return
true;
popupLinear.setVisibility(View.VISIBLE);
onTapListener.onTap(i,popupView);
popupLinear.measure(0,0);
intviewWidth=
popupLinear.getMeasuredWidth();
intviewHeight=
popupLinear.getMeasuredHeight();
LayoutParamslayoutParams=newLayoutParams(viewWidth,
viewHeight,
item.getPoint(),0,-60,
LayoutParams.BOTTOM_CENTER);
layoutParams.mode=
LayoutParams.MODE_MAP;
popupLinear.setLayoutParams(layoutParams);
Pointp=new
Point();
projection.toPixels(item.getPoint(),p);
p.y=
p.y-viewHeight/2;
GeoPointpoint=projection.fromPixels(p.x,
p.y);
mapView.getController().animateTo(point);
return
true;
}
privatebooleancreatePopupView(){
//TODOAuto-generated
methodstub
if(layoutId==0)
return
false;
popupView=LayoutInflater.from(context).inflate(layoutId,
null);
popupView.setBackgroundResource(R.drawable.popupborder);
ImageView
dialogStyle=newImageView(context);
dialogStyle.setImageDrawable(context.getResources().getDrawable(
R.drawable.iw_tail));
popupLinear.addView(popupView);
android.widget.LinearLayout.LayoutParamslp=new
android.widget.LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
lp.topMargin=
-2;
lp.leftMargin=60;
popupLinear.addView(dialogStyle,
lp);
mapView.addView(popupLinear);
returntrue;
}
@Override
publicvoidaddItem(List<OverlayItem>items)
{
//TODOAuto-generatedmethodstub
intstartIndex=
getAllItem().size();
for(OverlayItemitem:items){
if(startIndex>=defaultMarkerIds.length)
startIndex=
defaultMarkerIds.length-1;
if(useDefaultMarker&&
item.getMarker()==null){
item.setMarker(context.getResources().getDrawable(
defaultMarkerIds[startIndex++]));
}
}
super.addItem(items);
}
@Override
publicvoidaddItem(OverlayItemitem){
//
TODOAuto-generatedmethodstub
//
重載這兩個addItem方法,主要用於設置自己默認的Marker
intindex=
getAllItem().size();
if(index>=
defaultMarkerIds.length)
index=defaultMarkerIds.length-
1;
if(useDefaultMarker&&item.getMarker()==
null){
item.setMarker(context.getResources().getDrawable(
defaultMarkerIds[getAllItem().size()]));
}
super.addItem(item);
}
publicvoidsetLayoutId(intlayoutId){
this.layoutId=
layoutId;
}
publicvoidsetUseDefaultMarker(booleanuseDefaultMarker){
this.useDefaultMarker=useDefaultMarker;
}
publicvoidsetOnTapListener(OnTapListeneronTapListener){
this.onTapListener=onTapListener;
}
publicinterfaceOnTapListener{
publicvoidonTap(intindex,
ViewpopupView);
}
}

二、MainActivity,這是主界面,用來顯示地圖,創建MyPopupOverlay對象,在使用我寫的MyPopupOverlay這個類時,需要遵循以下步驟:


創建MyPopupOverlay對象,構造函數為public MyPopupOverlay(Context context, Drawable marker, MapView mMapView),四個參數分別為當前的上下文、通用的Marker(這是ItemizedOverlay需要的,當不設置Marker時的默認Marker)以及網路地圖對象。

設置自定義的彈出窗口內容的布局文件ID,使用的方法為public void setLayoutId(int layoutId)。

設置是使用自定義的Marker,還是預先寫好的帶有A-J字樣的網路地圖原裝Marker,使用的方法為public void setUseDefaultMarker(boolean useDefaultMarker),只有當這個值為true且沒有調用OverlayItem的setMarker方法為特定點設置Marker時,才使用原裝Marker。

創建Marker所在的點,即分別創建一個個OverlayItem,然後調用public void addItem(OverlayItem item)或public void addItem(List<OverlayItem> items)方法來把這些OverlayItem添加到自定義的附加層上去。

為MyPopupOverlay對象添加onTap事件,當Marker被點擊時,填充彈出窗口中的內容(也就是第2條中layoutId布局中的內容),設置方法為public void setOnTapListener(OnTapListener onTapListener),OnTapListener是定義在MyPopupOverlay中的介面,實現這個介面需要覆寫public void onTap(int index, View popupView)方法,其中,index表示被點擊的Marker(確切地說是OverlayItem)的索引,popupView是使用layoutId這個布局的View,也就是彈出窗口除了下面的小三角之外的部分。

把這個MyPopupOverlay對象添加到地圖上去:mMapView.getOverlays().add(myOverlay);mMapView.refresh();

B. android開發中獲取選中文字以及彈出框

只需要在Textview中增加android:textIsSelectable="true"即可長按彈出復制,如果要彈出對話框,那就要用Dialog,dialog的用法如下:
Android中,在Dialog中增加EditText需要使用view控制項,也可參考附件源代碼。
具體實現代碼:
1.創建對象框
AlertDialog.Builder builder = new Builder(context);
builder.setTitle("請輸入"); //設置對話框標題
builder.setIcon(android.R.drawable.btn_star); //設置對話框標題前的圖標

2.創建EditText輸入框
final EditText edit = new EditText(context);

3.將輸入框賦值給Dialog,並增加確定取消按鍵
builder.setView(edit);
builder.setPositiveButton("確認", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "你輸入的是: " + edit.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "你點了取消", Toast.LENGTH_SHORT).show();
}
});

4.設置常用api,並show彈出
builder.setCancelable(true); //設置按鈕是否可以按返回鍵取消,false則不可以取消
AlertDialog dialog = builder.create(); //創建對話框
dialog.setCanceledOnTouchOutside(true); //設置彈出框失去焦點是否隱藏,即點擊屏蔽其它地方是否隱藏
dialog.show();

C. android怎麼將彈出窗口透明

1. 在res/values 下建立color.xml
<resources>
<color name="transparent_background">#80ffffff</color>
</resources>
PS: #80是透明度的值(即80%透明),ffffff是顏色值(為黑色)
2. 在res/values下建立style.xml
<resources> <style name="Transparent" parent="android:style/Theme.Dialog"> <item name="android:windowBackground">@color/transparent_background</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowAnimationStyle">@+android:style/Animation.Translucent</item> </style></resources>
PS: parent="android:style/Theme.Dialog" 是將activity設置為彈出式窗口
3. 在AndroidManifest.xml中找到要彈出的activity,加入theme:
<activity android:name="ActivityName" android:theme="@style/Transparent" />完成上面設置後,你的activity就已經是透明的了,但是該Activity中的控制項還沒有透明,如果還需要控制項透明,則需要在該activity的代碼中加入如下代碼:
//設置activity中的控制項透明 Window window = getWindow(); WindowManager.LayoutParams wl = window.getAttributes(); wl.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; wl.alpha=0.95f;//設置透明度,0.0為完全透明,1.0為完全不透明 window.setAttributes(wl);

熱點內容
循跡小車演算法 發布:2024-12-22 22:28:41 瀏覽:79
scss一次編譯一直生成隨機數 發布:2024-12-22 22:04:24 瀏覽:954
嫁接睫毛加密 發布:2024-12-22 21:50:12 瀏覽:972
linuxbin文件的安裝 發布:2024-12-22 21:46:07 瀏覽:796
vlcforandroid下載 發布:2024-12-22 21:45:26 瀏覽:662
電腦做網關把數據發送至伺服器 發布:2024-12-22 21:44:50 瀏覽:429
新華三代理什麼牌子的伺服器 發布:2024-12-22 21:33:21 瀏覽:340
歡太會員密碼是什麼 發布:2024-12-22 20:57:28 瀏覽:71
sqllocaldb 發布:2024-12-22 20:07:08 瀏覽:123
如何找到我的伺服器 發布:2024-12-22 19:52:14 瀏覽:299