① android 如何重写imageview 让图片有圆角效果
android 自定义圆角ImageView以及锯齿的处理
看到很多人开发过程中要使用圆角图片时,解决方法有:
1.重新绘制一张图片
2.通过布局来配置
3.通过重写View来实现
其中1,2在这里就不讲了,重点讲讲方法三的实现。
实现一:通过截取画布一个圆形区域与图片的相交部分进行绘制,缺点:锯齿明显,设置Paint,Canvas抗锯齿无效。
package com.open.circleimageview.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.Region;
import android.util.AttributeSet;
import android.view.View;
public class CircleImageViewA extends View {
public CircleImageViewA(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CircleImageViewA(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CircleImageViewA(Context context) {
super(context);
}
private Bitmap bitmap;
private Rect bitmapRect=new Rect();
private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
private Paint paint = new Paint();
{
paint.setStyle(Paint.Style.STROKE);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了
}
private Path mPath=new Path();
public void setImageBitmap(Bitmap bitmap)
{
this.bitmap=bitmap;
}
@Override
protected void onDraw(Canvas canvas) {
if(null==bitmap)
{
return;
}
bitmapRect.set(0, 0, getWidth(), getHeight());
canvas.save();
canvas.setDrawFilter(pdf);
mPath.reset();
canvas.clipPath(mPath); // makes the clip empty
mPath.addCircle(getWidth()/2, getWidth()/2, getHeight()/2, Path.Direction.CCW);
canvas.clipPath(mPath, Region.Op.REPLACE);
canvas.drawBitmap(bitmap, null, bitmapRect, paint);
canvas.restore();
}
}
实现二:通过PorterDuffXfermode 方式(注意要设置硬件加速,否则部分机子无效),优点:锯齿基本没有
package com.open.circleimageview.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class CircleImageViewB extends View {
public CircleImageViewB(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public CircleImageViewB(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleImageViewB(Context context) {
super(context);
init();
}
private Bitmap bitmap;
private Rect bitmapRect=new Rect();
private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
private Paint paint = new Paint();
{
paint.setStyle(Paint.Style.STROKE);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了
}
private Bitmap mDstB=null;
private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);
private void init()
{
try {
if(android.os.Build.VERSION.SDK_INT>=11)
{
setLayerType(LAYER_TYPE_SOFTWARE, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setImageBitmap(Bitmap bitmap)
{
this.bitmap=bitmap;
}
private Bitmap makeDst(int w, int h)
{
Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bm);
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(Color.parseColor("#ffffffff"));
c.drawOval(new RectF(0, 0, w, h), p);
return bm;
}
@Override
protected void onDraw(Canvas canvas) {
if(null==bitmap)
{
return;
}
if(null==mDstB)
{
mDstB=makeDst(getWidth(), getHeight());
}
bitmapRect.set(0, 0, getWidth(), getHeight());
canvas.save();
canvas.setDrawFilter(pdf);
canvas.drawBitmap(mDstB, 0, 0, paint);
paint.setXfermode(xfermode);
canvas.drawBitmap(bitmap, null, bitmapRect, paint);
paint.setXfermode(null);
canvas.restore();
}
}
② android怎么viewpager实现循环切换图片
Android中的ViewPager则实现了左右滑动的效果,ViewPager类提供了多界面切换的新效果。利用ViewPager实现图片循环滚动代码如下:
1、首先是布局文件,使用了一个ViewPager控件:
java"><spanstyle="padding:0px;margin:0px;font-size:14px;"><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dip">
<TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="第一个引导页面"
android:textColor="@android:color/white"
android:textSize="14sp"/>
<LinearLayout
android:id="@+id/ll_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
</RelativeLayout></span>
2、接下来实现一个继承PagerAdapter的MyAdapter类,实现一个PagerAdapter,代码如下:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.List;
importandroid.support.v4.view.PagerAdapter;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
{
privateList<ImageView>mImageViewList;
publicViewPagerAdapter(List<ImageView>imageViewList){
super();
this.mImageViewList=imageViewList;
}
/**
*该方法将返回所包含的Item总个数。为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item,
*其实这并非是真正的无限循环。
*/
@Override
publicintgetCount(){
returnInteger.MAX_VALUE;
}
/**
*判断出去的view是否等于进来的view如果为true直接复用
*/
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;
}
/**
*销毁预加载以外的view对象,会把需要销毁的对象的索引位置传进来,就是position,
*因为mImageViewList只有五条数据,而position将会取到很大的值,
*所以使用取余数的方法来获取每一条数据项。
*/
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
container.removeView(mImageViewList.get(position%mImageViewList.size()));
}
/**
*创建一个view,
*/
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){
container.addView(mImageViewList.get(position%mImageViewList.size()));
returnmImageViewList.get(position%mImageViewList.size());
}
}
</span>
3、最后是主界面部分的代码:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.os.SystemClock;
importandroid.support.v4.view.ViewPager;
importandroid.support.v4.view.ViewPager.OnPageChangeListener;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.LinearLayout.LayoutParams;
importandroid.widget.TextView;
{
privateList<ImageView>imageViewList;
privateTextViewtvDescription;
privateLinearLayoutllPoints;
privateString[]imageDescriptions;
=0;
privateViewPagermViewPager;
privatebooleanisLoop=true;
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1);
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setView();
initView();
}
publicvoidsetView(){
setContentView(R.layout.activity_splash_viewpager);
//自动切换页面功能
newThread(newRunnable(){
@Override
publicvoidrun(){
while(isLoop){
SystemClock.sleep(2000);
handler.sendEmptyMessage(0);
}
}
}).start();
}
publicvoidinitView(){
mViewPager=(ViewPager)findViewById(R.id.viewpager);
tvDescription=(TextView)findViewById(R.id.tv_image_description);
llPoints=(LinearLayout)findViewById(R.id.ll_points);
prepareData();
ViewPagerAdapteradapter=newViewPagerAdapter(imageViewList);
mViewPager.setAdapter(adapter);
mViewPager.setOnPageChangeListener(this);
tvDescription.setText(imageDescriptions[previousSelectPosition]);
llPoints.getChildAt(previousSelectPosition).setEnabled(true);
/**
*2147483647/2=1073741820-1
*设置ViewPager的当前项为一个比较大的数,以便一开始就可以左右循环滑动
*/
intn=Integer.MAX_VALUE/2%imageViewList.size();
intitemPosition=Integer.MAX_VALUE/2-n;
mViewPager.setCurrentItem(itemPosition);
}
privatevoidprepareData(){
imageViewList=newArrayList<ImageView>();
int[]imageResIDs=getImageResIDs();
imageDescriptions=getImageDescription();
ImageViewiv;
Viewview;
for(inti=0;i<imageResIDs.length;i++){
iv=newImageView(this);
iv.setBackgroundResource(imageResIDs[i]);
imageViewList.add(iv);
//添加点view对象
view=newView(this);
view.setBackgroundDrawable(getResources().getDrawable(R.drawable.point_background));
LayoutParamslp=newLayoutParams(5,5);
lp.leftMargin=10;
view.setLayoutParams(lp);
view.setEnabled(false);
llPoints.addView(view);
}
}
privateint[]getImageResIDs(){
returnnewint[]{
R.drawable.bg1,
R.drawable.bg2,
R.drawable.bg3,
R.drawable.pic_01,
R.drawable.pic_02
};
}
privateString[]getImageDescription(){
returnnewString[]{
"第一个引导页面",
"第二个引导页面",
"第三个引导页面",
"第四个引导页面",
"第五个引导页面"
};
}
@Override
(intarg0){
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageSelected(intposition){
//改变图片的描述信息
tvDescription.setText(imageDescriptions[position%imageViewList.size()]);
//切换选中的点,把前一个点置为normal状态
llPoints.getChildAt(previousSelectPosition).setEnabled(false);
//把当前选中的position对应的点置为enabled状态
llPoints.getChildAt(position%imageViewList.size()).setEnabled(true);
previousSelectPosition=position%imageViewList.size();
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
isLoop=false;
}
}
</span>
③ android 如何实现图片视频混合播放啊
直接上代码:
布局文件就是两个全屏的videoview和imageview重叠
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/pictureView"
android:scaleType="fitXY"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
java部分:
/*
视频图片混合展示demo
*/
packagecom.example.administrator.hunbo;
importandroid.content.Context;
importandroid.media.MediaPlayer;
importandroid.net.Uri;
importandroid.os.Handler;
importandroid.os.storage.StorageManager;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.Toast;
importandroid.widget.VideoView;
importjava.io.File;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.util.ArrayList;
{
privateVideoViewvideoView;
privateImageViewpictureView;
booleanisPlaying=false;
privateArrayListarrayList=newArrayList<String>();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().hide();//隐藏actionBar
//初始化控件
videoView=findViewById(R.id.videoView);
pictureView=findViewById(R.id.pictureView);
//最开始两个view都是隐藏的
videoView.setVisibility(View.GONE);
pictureView.setVisibility(View.GONE);
//检测SD卡是否存在
String[]result=null;
StorageManagerstorageManager=(StorageManager)getSystemService(Context.STORAGE_SERVICE);
try{
Methodmethod=StorageManager.class.getMethod("getVolumePaths");
method.setAccessible(true);
try{
result=(String[])method.invoke(storageManager);
}catch(InvocationTargetExceptione){
e.printStackTrace();
}
if(result.length>1){
//Toast.makeText(this,"检测到U盘",Toast.LENGTH_SHORT).show();
AllFilesPath("/mnt/usb/");
playList();
}else{
Toast.makeText(this,"未检测到U盘,请在开机前插入U盘,或者重新启动此应用",Toast.LENGTH_SHORT).show();
Handlerhandler=newHandler();
handler.postDelayed(newRunnable(){
@Override
publicvoidrun(){
finish();
}
},2500);
}
}catch(Exceptione){
e.printStackTrace();
}
}
//获取所有图片视频的绝对路径到arraylist
privateArrayListAllFilesPath(Stringpath){
Filefile=newFile(path);
File[]files=file.listFiles();
for(Filef:files){
if(f.getName().endsWith("jpg")||f.getName().endsWith("jpeg")||f.getName().endsWith("mp4")
||f.getName().endsWith("avi")||f.getName().endsWith("mkv")||f.getName().endsWith("rmvb")
||f.getName().endsWith("flv")){
System.out.println("------------获取到了一个可用路径:"+f.getAbsolutePath());
arrayList.add(f.getAbsolutePath());//添加到arralist
}elseif(f.isDirectory()){
AllFilesPath(f.getAbsolutePath());
}
}
returnarrayList;
}
//依次混合播放arralist里的图片或视频
publicintlistNum;
privatevoidplayList(){
if(listNum>=arrayList.size()){
finish();
//listNum=0;
}else{
System.out.println("---------------------------收入路径---------------------------");
System.out.println("isplaying="+isPlaying);
finalFilef=newFile(arrayList.get(listNum).toString());
if(f.getName().endsWith("jpg")||f.getName().endsWith("jpeg")||f.getName().endsWith("png")){
System.out.println("---------------------------添加了一张图片:"+f.getAbsolutePath());
pictureView.setVisibility(View.VISIBLE);
pictureView.setImageURI(Uri.fromFile(f));
Handlerhandler=newHandler();
handler.postDelayed(newRunnable(){
@Override
publicvoidrun(){
System.out.println("---------------------------播完了一张位于"+f.getAbsolutePath()+"的图片》》》》》》》》》》》》》》》》》");
pictureView.setVisibility(View.GONE);
listNum++;
playList();
}
},2000);//2秒后结束当前图片
}elseif(f.getName().endsWith("mp4")||f.getName().endsWith("avi")||f.getName().endsWith("mkv")
||f.getName().endsWith("rmvb")||f.getName().endsWith("flv")){
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~添加了一个视频"+f.getAbsolutePath());
videoView.setVideoPath(f.getAbsolutePath());
videoView.setVisibility(View.VISIBLE);//播放之前显示videoView
videoView.start();
videoView.setOnCompletionListener(newMediaPlayer.OnCompletionListener(){
@Override
publicvoidonCompletion(MediaPlayermp){
System.out.println("---------------------------播完了一个位于"+f.getAbsolutePath()+"的视频《《《《《《《《《《《《《《《《《《");
videoView.setVisibility(View.GONE);//视频播放完毕后隐藏videoView
listNum++;
playList();
}
});
}
}
}
④ Androidwidget这个是什么老弹出来让我下一些软件,我卸载了它它还自动
我也遇到相同的问题,总是卸载了又在我不知道的情况下自动安装上去了,还总是弹出广告,经常不小心点到它突然弹出的广告导致自动下载了,一个月的流量有三分之一是被它用掉的,烦死了。简直是流氓插件!
我就想这东西是联网就自动安装的,我没办法彻底铲除,那就装着,我不删你吧,但你的广告我总要关掉,我在管理软件和流量控制里面把它的wifi联网和2G/3G联网全部都关了,看他哪里来的广告源。
待观察中。。。。。。
————
不知道其他人解决得如何了,我关掉它的联网后觉得广告频率少很多了,但偶尔还是有出来。
已经是用了三年多的手机了,早想换一个。
⑤ android浣跨敤ViewPager瀹炵幇杞鎾鏁堟灉鏁欑▼
ViewPager锛氢竴涓鍙浠ュ疄鐜拌嗗浘宸﹀彸婊戝姩鍒囨崲镄勬带浠躲
ViewPager镄勫熀链浣跨敤锛
ViewPager镄勮嗗浘闇瑕侀氲繃PagerAdapter𨱒ュ疄鐜版樉绀恒
PagerAdapter镄勪富瑕佹柟娉曪细
鈼 getCount 瑙嗗浘镄勬暟閲
鈼 instantiateItem 娣诲姞瑙嗗浘
鈼 destroyItem 阌姣佽嗗浘
鈼 isViewFromObject 鏄钖︾敱瀵硅薄鍒涘缓瑙嗗浘
ViewPager镄勫父鐢ㄦ柟娉曪细
setAdapter 璁剧疆阃傞厤鍣
addOnPageChangeListener 鐩戝惉椤甸溃鍒囨崲镄勭姸镐
setCurrentItem 璁剧疆褰揿墠椤甸溃镄勭储寮
瀹炵幇骞垮憡杞鎾
鎶链镣瑰垎鏋愶细
1銆佺绣缁滆繛鎺
2銆丣SON瑙f瀽
3銆乂iewPager镄勫埯濮嫔寲
4銆佸浘鐗囩殑寮傛ュ姞杞
5銆佸浑镣规寚绀哄櫒镄勫疄鐜
浣跨敤selector+shape瀹炵幇鍦嗙偣锲剧墖
锷ㄦ佸垱寤篒mageView娣诲姞鍒伴泦钖堜腑锛屽悓镞舵坊锷犲埌甯冨眬涓
鍦╒iewPager鍒囨崲浜嬩欢涓锛屽垏鎹㈠浑镣圭姸镐
6銆佽嚜锷ㄥ垏鎹㈡晥鏋
浣跨敤Handler镄刾ost鏂规硶锛屽畾镞舵墽琛屼唬镰
璧勬簮鏂囦欢锛
mydot.xml //鍒涘缓鍦嗙偣璧勬簮锛屾斁鍦╠rawable鏂囦欢涓
甯冨眬鏂囦欢锛
activity_main.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_list" /
activity_banner.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/vp_image"
android:layout_width="wrap_content"
android:layout_height="150dp"
android:layout_gravity="center" /
android:layout_width="match_parent"
android:layout_height="40dp"
android:id="@+id/layout"
android:layout_gravity="bottom"
android:gravity="center"
android:orientation="horizontal"
java浠g爜
ImageLoader.java //璇ヤ唬镰佹槸阃氲繃URL銮峰彇锲剧墖璧勬簮
package cn.e.huse.banner_re.util;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 锲剧墖锷犺浇镄勫伐鍏风被
* @author xray
*
*/
public class ImageLoader {
/**
* 锲剧墖锷犺浇瀹屾垚镄勫洖璋冩帴鍙
* 娣诲姞URL鍙傛暟锛岀敤浜庡仛锲剧墖阌欎綅鍒ゆ柇
*/
public interface OnImageLoadListener{
//瀹屾垚锲剧墖锷犺浇
void onImageLoadComplete(String url, Bitmap bitmap);
}
private OnImageLoadListener mListener;
/**
* 钖锷ㄥ浘鐗囧姞杞戒换锷
* @param urlStr
* @param listener
*/
public void loadImage(String urlStr,OnImageLoadListener listener){
this.mListener = listener;
new ImageLoadTask().execute(urlStr);
}
/**
* 锲剧墖锷犺浇浠诲姟
* @author xray
*
*/
class ImageLoadTask extends AsyncTask
@Override
protected UrlAndBitmap doInBackground(String... params) {
try {
//鍒涘缓URL锛屾寚瀹氩浘鐗囧湴鍧
URL url = new URL(params[0]);
//镓揿紑杩炴帴銮峰缑HttpURLConnection瀵硅薄
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//銮峰缑鏂囦欢杈揿叆娴
InputStream stream = conn.getInputStream();
//鎶婅緭鍏ユ祦杞鎹涓哄浘鐗
Bitmap bmp = BitmapFactory.decodeStream(stream);
//鍏抽棴娴
stream.close();
return new UrlAndBitmap(params[0],bmp);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//鍖呰呭浘鐗囧湴鍧鍜屽浘鐗
class UrlAndBitmap{
String url;
Bitmap bitmap;
public UrlAndBitmap(String url, Bitmap bitmap) {
this.url = url;
this.bitmap = bitmap;
}
}
@Override
protected void onPostExecute(UrlAndBitmap result) {
//杩涜屾帴鍙e洖璋
if(mListener != null){
mListener.onImageLoadComplete(result.url,result.bitmap);
}
}
}
}
JSONLoader.java
//璇诲彇链嶅姟鍣╦son
package cn.e.huse.banner_re.util;
import android.os.AsyncTask;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 璇诲彇链嶅姟鍣↗SON镄勫伐鍏风被
* @author xray
*
*/
public class JSONLoader {
public interface OnJSONLoadListener{
void onJSONLoadComplete(String json);
}
private OnJSONLoadListener mListener;
public void loadJSON(String urlStr,OnJSONLoadListener listener){
this.mListener = listener;
new JSONLoadTask().execute(urlStr);
}
class JSONLoadTask extends AsyncTask
@Override
protected String doInBackground(String... params) {
try {
URL url = new URL(params[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream inputStream = conn.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
//StringBuffer 绾跨▼瀹夊叏锛屾ц兘浣 VS StringBuilder 绾跨▼涓嶅畨鍏锛屾ц兘楂
StringBuilder strB = new StringBuilder();
while((len = inputStream.read(buffer)) != -1){
//灏嗗瓧鑺傜爜杞鎹涓篠tring
String str = new String(buffer,0,len);
strB.append(str);
}
inputStream.close();
return strB.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
if(mListener != null){
mListener.onJSONLoadComplete(result);
}
}
}
}
MyViewPagerAdapter.java
package cn.e.huse.banner_re.adapter;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
/**
* 锲剧墖杞鎾镄勯傞厤鍣
* @author Lenovo
*
*/
public class MyViewPagerAdapter extends PagerAdapter {
private List mData;
public MyViewPagerAdapter(List mData) {
this.mData = mData;
}
//杩斿洖瑙嗗浘镄勬暟閲
@Override
public int getCount() {
return mData.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
//阌姣佸浘鐗
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mData.get(position));
}
//娣诲姞锲剧墖
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mData.get(position));
return mData.get(position);
}
}
MainActivity.java
package cn.e.huse.banner_re;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import cn.e.huse.banner_re.adapter.MyViewPagerAdapter;
import cn.e.huse.banner_re.util.ImageLoader;
import cn.e.huse.banner_re.util.ImageLoader.OnImageLoadListener;
import cn.e.huse.banner_re.util.JSONLoader;
import cn.e.huse.banner_re.util.JSONLoader.OnJSONLoadListener;
public class MainActivity extends Activity implements OnClickListener{
public static final String URL_GIFT = "http://www.1688wan.com/majax.action?method=getGiftListpageno=1";
public static final String URL_BASE = "http://www.1688wan.com";
private ListView mLv;
//鏀剧疆鍦嗙偣锲剧墖镄勫竷灞
private LinearLayout mLayout;
private ViewPager mPager;
//淇濆瓨viewpager涓婂浘鐗囩殑闆嗗悎
private List mImageViews;
//淇濆瓨鍦嗙偣锲剧墖镄勯泦钖
private List mDotViews;
//褰揿墠锲剧墖
private ImageView mDotView;
//褰揿墠涓嬫爣
private int mIndex;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//鍒濆嫔寲viewpager
initViewPager();
}
private void initViewPager() {
new JSONLoader().loadJSON(URL_GIFT, new OnJSONLoadListener() {
@Override
public void onJSONLoadComplete(String json) {
//寰楀埌锲剧墖镄勫湴鍧
List list = josnPare(json);
//鍒濆嫔寲涓绘带浠
initView();
//灏嗗浘鐗囨樉绀哄埌viewpager涓
initImageViews(list);
//涓笃iewPager璁剧疆阃傞厤鍣
mPager.setAdapter(new MyViewPagerAdapter(mImageViews));
//锷犺浇鍦嗙偣锲剧墖
initDot(mImageViews.size());
//瀹炵幇锲剧墖镄勮疆鎾
mPager.postDelayed(new Runnable() {
@Override
public void run() {
//涓嬫爣镊锷++
mIndex++;
//褰扑笅镙囧埌链钖庢椂锛屽氨閲嶆柊𨱒ヨ繃
if(mIndex = mImageViews.size()){
mIndex = 0;
}
//璁剧疆锲剧墖
mPager.setCurrentItem(mIndex);
//閲嶅嶈皟鐢
mHandler.postDelayed(this, 1500);
}
}, 1500);
//娣诲姞椤电爜婊戝姩镄勭洃钖锛屽疄鐜板浑镣瑰浘鐗囩殑鍒囨崲
mPager.setOnPageChangeListener(new OnPageChangeListener() {
//椤甸変腑钖庤皟鐢
@Override
public void onPageSelected(int arg0) {
//鏀瑰彉铡熸潵镄勫浑镣瑰浘鐗囩殑鐘舵
mDotView.setEnabled(true);
//镟存柊褰揿墠镄勫浑镣瑰浘鐗
mDotView = mDotViews.get(arg0);
//灏嗗綋鍓嶉変腑镄勫浑镣硅句负阃変腑鐘舵
mDotView.setEnabled(false);
//镟存柊涓嬫爣
mIndex = arg0;
}
//婊戝姩涓阃旇皟鐢
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
//椤甸溃婊戝姩鐘舵佷慨鏀
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
});
}
/**銮峰彇鍦嗙偣锲剧墖鍑芥暟
* @param count viewpager涓婂浘鐗囩殑鏁伴噺
*/
private void initDot(int count){
mDotViews = new ArrayList();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
//璁剧疆杈硅窛
params.setMargins(5, 0, 5, 0);
for(int i = 0; i count; i++){
ImageView image = new ImageView(this);
//璁剧疆鍦嗙偣锲剧墖
image.setImageResource(R.drawable.mydot);
//璁剧疆锲剧墖镄勪綅缃锛屾柟渚垮悗闱㈢殑鍙栧
image.setTag(i);
//璁剧疆鐩戝惉
image.setOnClickListener(this);
//娣诲姞鍒板竷灞涓
mLayout.addView(image, params);
//灏嗗浑镣瑰浘鐗囦缭瀛桦埌闆嗗悎涓
mDotViews.add(image);
}
mDotView = mDotViews.get(0);
mDotView.setEnabled(false);
}
/**
*鏄剧ず锲剧墖镄勫嚱鏁
*/
private void initImageViews(List list) {
mImageViews = new ArrayList();
for(String str : list){
final ImageView imageView = new ImageView(this);
//璁剧疆榛樿ゅ浘鐗
imageView.setImageResource(R.drawable.ic_launcher);
new ImageLoader().loadImage(URL_BASE+str, new OnImageLoadListener() {
@Override
public void onImageLoadComplete(String url, Bitmap bitmap) {
if(bitmap != null){
imageView.setImageBitmap(bitmap);
}
}
});
//灏咺mageView淇濆瓨鍒伴泦钖堜腑
mImageViews.add(imageView);
}
}
/**
* JSON瑙f瀽銮峰彇锲剧墖镄勫湴鍧
* @param url
* @return
*/
private List josnPare(String url){
List list = new ArrayList();
try {
JSONObject jobj = new JSONObject(url);
JSONArray array = jobj.getJSONArray("ad");
for(int i = 0; i array.length(); i++){
JSONObject obj = (JSONObject) array.get(i);
list.add(obj.getString("iconurl"));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 鍒濆嫔寲鎺т欢
*/
private void initView() {
//镓惧埌鎺т欢
mLv = (ListView) findViewById(R.id.lv_list);
View view = LayoutInflater.from(this).inflate(R.layout.activity_banner, null);
mPager = (ViewPager)view.findViewById(R.id.vp_image);
//鍦嗙偣锲剧墖甯冨眬
mLayout = (LinearLayout)view.findViewById(R.id.layout);
//妯℃嫙鏁版嵁
List mList = new ArrayList();
for(int i = 0; i 20; i++){
mList.add("𨱒$洰--"+i);
}
//鍒涘缓阃傞厤鍣
ArrayAdapter mAdapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
mList);
//璁剧疆澶撮儴瑙嗗浘
mLv.addHeaderView(view);
//璁剧疆阃傞厤鍣
mLv.setAdapter(mAdapter);
/*//鍦嗙偣锲剧墖甯冨眬
mLayout = (LinearLayout)findViewById(R.id.layout);*/
}
/**
* 鍦嗙偣锲剧墖镄勭洃钖浜嬩欢
*/
@Override
public void onClick(View arg0) {
//銮峰彇璇ュ浑镣瑰浘鐗囩殑浣岖疆
int index = Integer.parseInt(arg0.getTag().toString());
//灏唙iewpager镄勫浘鐗囨樉绀烘垚涓嬫爣涓篿ndex镄勫浘鐗
mPager.setCurrentItem(index);
//灏嗗师𨱒ョ殑璁剧疆鎴愰粯璁ゅ
mDotView.setEnabled(true);
//淇濆瓨鏂扮殑鍊
mDotView = (ImageView) arg0;
//灏嗘柊镄勫兼敼鍙樻垚false
mDotView.setEnabled(false);
//镟存柊涓嬫爣
mIndex = index;
}
}
娉ㄦ剰锛氩洜涓鸿繖閲岀敤鍒颁简json瑙f瀽锛岄渶瑕佺敤鍒拌仈缃戞搷浣滐纴涓瀹氲佸啓涓娄笂缃戠殑𨱒冮檺锛
銆銆杩愯屾晥鏋滐细
⑥ android 能在屏幕上绘一张小图片,然后透明背景,还能操作能看到的背景桌面图标或程序。
package com.qdsx.cml;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
//import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
public class TestdonghuaActivity extends Activity {
private ImageView tweenMM;
// private Animation animation;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tweenMM =(ImageView)findViewById(R.id.imageView1);
}
//渐变
public void BtnAlphaOnClick(View view){
//this.doStartAnimation(R.anim.alpha_animation);
Animation b = new AlphaAnimation(0.1f, 1.0f);
b.setDuration(2000);
tweenMM.startAnimation(b);
}
//旋转
public void BtnrotateOnClick(View view){
//this.doStartAnimation(R.anim.rotate_animation);
Animation c = new RotateAnimation(0, 360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
c.setDuration(3000);
tweenMM.startAnimation(c);
}
//缩放
public void BtnScaleOnClick(View view){
//this.doStartAnimation(R.anim.scale_animation);
Animation d = new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);
d.setDuration(3000);
tweenMM.startAnimation(d);
}
//位移
public void BtnTransalteOnclick(View view){
//this.doStartAnimation(R.anim.translate_animation);
Animation a= new TranslateAnimation(0, 100, 0, 100);
a.setDuration(5000);
a.setFillAfter(true);//使图片移动后固定
tweenMM.startAnimation(a);
}
//开始动画方法
/* private void doStartAnimation(int animid){
animation = AnimationUtils.loadAnimation(this, animid);
animation.setFillAfter(true);//使图片移动后固定
tweenMM.startAnimation(animation);
}*/
}
⑦ androidwidget有用吗
1.身材微:它们一般都很小,在终端上嵌入非常方便,运行快速。
2.形式多:Widget可以以多种形式呈现出来,幻灯秀、视频、地图、新闻、小游戏……
3.功能巨:别看它们小,却服务周到,它可以为你报告新闻、帮你买东西、列出你最喜欢的乐队,还有你最近看的视频。另外,它还是一个殷勤的管家,你不必亲自去Flickr或者天气预报网站,Widget会将信息主动带给你。
4.姿容丽:它们可以称得上玉面飞龙、以色服人。只要你愿意,你可以把它变成任何你想要得样子。它的出现,无异于一枚“桌面炸弹”,狭窄而单调的IE窗口将被更为广阔和绚丽的桌面空间所取代。
5.个性化:Widget更像一个属于我们每个人的魔方,任由用户聚合。你可以根据自己喜好,将多个Widget,随心所欲的去精心组装你的网络世界。通过Widget,可以用户把一切在“网”中的内容打乱重来,并按照用户希望看到的样子重新排列组合一个属于自己的互联网。比如说一个由微件搭建个人空间,可以包括来自新浪的体育新闻,来自论坛的一个板块,来自权威财经网站的一则随时更新的股票信息 ——这些以往需要用户同时分别进入几个网站才能看到的信息,现在由一个个微件将其转变为用户个人空间的一部分,从而可以直接在同一个页面中并存。传统互联网访问方式处于分裂状态的后Web2.0时期,多样性、炫酷且更具个性化的Widget流行,或许能引领一个新的潮流。
6.易制作:制作 Widget 部件并不复杂,只需要熟悉三方面的知识:图像处理、HTML/XML、java,就可以按照开发站点里的教程做出漂亮的部件来。Widget能够流行的一个要点在于开放制作,UGC应用带来爆炸式地增长。
那么,什么是android widget呢?
在Android 1.5 SDK preview中,我们看到了一系列功能和API上的变化变化,包括软键盘、桌面Widget和Live Folder API、视频录制API,蓝牙功能升级等,Google近来对于这些全新功能的解析使得Android开发者blog变得异常活跃。上周,Jeff Sharkey就有一篇对于Android桌面widget和AppWidget框架的简介,以“Word of the day”的一个例子讲述了桌面Widget的运作机制。昨天他又在个人blog上放出了一个天气预报Widget的例子,事实上这已经是一个真正实用的程序了。它每天更新4次天气预报,我们可以添加多个Widget来关注多个城市的天气情况,另外,点击Widget后我们还可以看到今后几天的详细预报。
这让我想起了HTC Source的Nick Gray上周的一篇文章Android Widgets, Unlimited Potential中提到的几类可能会大受欢迎的Android桌面Widget。
Android本身已经自带了时钟、音乐播放器、相框和Google搜索4个Widget程序,不过这并不能阻止大家开发自己更加美观,功能更丰富的版本。另外,微博客、RSS订阅、股市信息、天气预报这些Widget也都有流行的可能。
微博客Widget:Twidroid是Android上迄今为止最棒的Twitter客户端,大家显然都期待着它会推出支持桌面Widget的版本,另外像国内比较受欢迎的饭否、嘀咕、叽歪等应该也会有类似的Widget推出。对于一个微博客类的Widget来说,有两个方面是必不可少的,一是用来发布消息,另一个则是用来浏览。
RSS订阅Widget: 尽管微博客(尤其是Twitter)已经完全盖过来RSS订阅的风头,越来越多的人用Twitter来跟踪站点的更新,不过RSS订阅也并非完全没有了市场,像分类订阅这样的功能还是需要RSS来帮忙,另外站点管理员也未必会在Twitter上发布所有的更新。
股市信息Widget:对于炒股的人来说,大概没有什么能比在手机桌面上放上几个所关注股票的实时股价更有运筹帷幄的感觉了吧。
天气预报Widget:对于我这样成天窝在办公室或者家里的人来说,有一个Widget能够让我了解当前的天气和近1、2天的天气是非常有用的,这大概会大大减少我下了楼又跑回去拿雨伞的几率。如果能加上像TouchFLO 3D中那样的UI效果,当然就更酷了。
这只是我现在想到的一些Widget,得益于Android 1.5为我们提供的Widget API为我们的手机桌面带来的无限的可能,我们的手机桌面无疑将会更有趣。
对国内G1的用户,如果想体验Android 1.5的桌面Widget,可以看看Haykuro的blog,他正在为制作G1可用的Android 1.5 ROM而努力。另外,T-Mobile已经计划在五月向德国的T-Mobile G1用户推送1.5的更新了,所以即使到时候没有官方的G1简体中文1.5 ROM,相信Haykuro的 1.5 ROM for G1也能非常接近官方的成熟度。
Widget应用目前在Android手机上得到了广泛的应用。由于其方便小巧,所以得到了很多的应用,像天气,微博,信息,歌曲,时间等等。
关于android Wpp widget:
应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget provider来发布一个Widget。可以容纳其它App Widget的应用程序组件被称为App Widget宿主。下面的截屏显示了一个音乐App Widget。