欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

Android图像处理技术(实现Android中的PS)

时间:2022-06-10 08:20:19 其他范文 收藏本文 下载本文

下面是小编整理的Android图像处理技术(实现Android中的PS),本文共10篇,欢迎大家阅读借鉴,并有积极分享。

Android图像处理技术(实现Android中的PS)

篇1:Android图像处理技术(实现Android中的PS)

今天我们接着上次讲的内容,介绍另一种改变图片色彩的方法:像素;

今天通过一个例子来熟悉像素操作:实现图片的 底片,怀旧,雕塑,这三种比较有意思的效果,

首先,上图,勾引一下你。

然后开始:

我们知道,图片是由众多排列紧密的像素点构成,每一个像素点都包含四个信息,即R,G,B,A;于是,我们通过改变每个像素的这几个值,就可以达到改变图片色彩的目的:这就是我们的主要思路,下面我们开始代码的编写工作。

新建一个xml文件:vcD4NCjxwcmUgY2xhc3M9”brush:java;“>

很简单,四个图片,均匀分布,分别用来显示:原图,底片,怀旧,雕塑

在贴代码之前,首先发几张图帮助理解:

下面是实现三个效果的代码,并有详细的注释:

首先:底片

public Bitmap handleNegative(Bitmap bt) { int width = bt.getWidth; int height = bt.getHeight(); int color; int r, g, b, a; Bitmap bmp = Bitmap.createBitmap(width, height, Config.ARGB_8888); // 存放原来的像素值 int oldPix[] = new int[width * height]; int newPix[] = new int[width * height]; // 将像素值赋值给oldpix; bt.getPixels(oldPix, 0, width, 0, 0, width, height); // 循环取出每个像素,并对其进行更改 for (int i = 0; i < oldPix.length; i++) {// 分别取出这个像素值对应的RGB值color = oldPix[i];r = Color.red(color);g = Color.green(color);b = Color.red(color);a = Color.alpha(color);// 应用底片变换公式r = 255 - r;g = 255 - g;b = 255 - b;// 检查越界if (r < 0) { r = 0;} else if (r > 255) { r = 255;}if (g < 0) { g = 0;} else if (g > 255) { g = 255;}if (b < 0) { b = 0;} else if (b > 255) { b = 255;}newPix[i] = Color.argb(a, r, g, b); } bmp.setPixels(newPix, 0, width, 0, 0, width, height); return bmp; }

其次:怀旧

public Bitmap handleOld(Bitmap bt) { int width = bt.getWidth(); int height = bt.getHeight(); int color; int r, g, b, a; Bitmap bmp = Bitmap.createBitmap(width, height, Config.ARGB_8888); // 存放原来的像素值 int oldPix[] = new int[width * height]; int newPix[] = new int[width * height]; // 将像素值赋值给oldpix; bt.getPixels(oldPix, 0, width, 0, 0, width, height); // 循环取出每个像素,并对其进行更改 for (int i = 0; i < oldPix.length; i++) {// 分别取出这个像素值对应的RGB值color = oldPix[i];r = Color.red(color);g = Color.green(color);b = Color.red(color);a = Color.alpha(color);// 应用底片变换公式r = (int) (0.393*r+0.769*r+0.189*r);g = (int) (0.349*g+0.686*g+0.189*g);b = (int) (0.272*b+0.534*b+0.131*b);// 检查越界if (r < 0) { r = 0;} else if (r > 255) { r = 255;}if (g < 0) { g = 0;} else if (g > 255) { g = 255;}if (b < 0) { b = 0;} else if (b > 255) { b = 255;}newPix[i] = Color.argb(a, r, g, b); } bmp.setPixels(newPix, 0, width, 0, 0, width, height); return bmp; }

最后:雕塑

public Bitmap handleRelief(Bitmap bt) { int width = bt.getWidth(); int height = bt.getHeight(); int color,color1; int r, g, b, a; int r1,g1,b1; Bitmap bmp = Bitmap.createBitmap(width, height, Config.ARGB_8888); // 存放原来的像素值 int oldPix[] = new int[width * height]; int newPix[] = new int[width * height]; // 将像素值赋值给oldpix; bt.getPixels(oldPix, 0, width, 0, 0, width, height); // 循环取出每个像素,并对其进行更改 for (int i = 0; i < oldPix.length; i++) {// 分别取出这个像素值对应的RGB值color = oldPix[i];r = Color.red(color);g = Color.green(color);b = Color.red(color);a = Color.alpha(color);//注意这里的处理:防止数组越界color1 = oldPix[i==0?0:i-1];r1 = Color.red(color1);g1 = Color.green(color1);b1 = Color.red(color1);// 应用底片变换公式r = r1-r+127;g = g1-g+127;b = b1-b+127;// 检查越界if (r < 0) { r = 0;} else if (r > 255) { r = 255;}if (g < 0) { g = 0;} else if (g > 255) { g = 255;}if (b < 0) { b = 0;} else if (b > 255) { b = 255;}newPix[i] = Color.argb(a, r, g, b); } bmp.setPixels(newPix, 0, width, 0, 0, width, height); return bmp; }

很容易理解了,

篇2:Android中RemoteViews的实现

本文结合AppWidget的应用场景,分析Android中RemoteViews的内部具体实现,

从前文《Android中AppWidget的分析与应用:AppWidgetProvider》和《Android中Launcher对于AppWidget的处理的分析:AppWidgetHost角色》中得知,Android中AppWidget的图形资源是由AppWidgetProvider通过RemoteViews提供的;而显示是由AppWidgetHost通过AppWidgetHostView把RemoteView提供的内容显示在本地View上的。AppWidgetProvider和AppWidgetHostView运行在不同的程序中,而它们沟通的图形元素和点击回馈的桥梁就是RemoteViews。

下面为了行文方便和一致,把RemoteViews的内容提供方AppWidgetProvoder称作Remote端;而显示RemoteViews内容的一方AppWidgetHost称作Local端。

一、给RemoteViews提供内容——SettingsAppWidgetProvider

下图是SettingsAppWidgetProvider(位于Settings中的com.android.settings.widget包中)作为AppWidgetProvider得到update通知之后,创建RemoteViews,并把Remote端的响应Intent以及图形元素放进RemoteViews中的顺序图。

图一、为RemoteViews提供内容和侦听

图中,

1.       Settings创建RemoteViews时,把packageName和layoutId传进去并保存起来。packageName相当重要,因为这里的layoutId和各种其他资源都是相对这个程序来说的,只有通过packageName获得相应的Context,才能进而获得资源,否则其他程序是无法获得这些资源的[Seq#1]。

2.       Settings把layoutId中的viewId指示的View被点击之后获得响应的PendingIntent设置到RemoteViews中[Seq#2~ #5]。

RemoteViews创建SetOnClickPendingIntent并把id和intent传入,SetOnClickPendingIntent保存这些值;

SetOnClickPendingIntent是RemoteViews.Action的子类,通过addAction()把SetOnClickPendingIntent加入到mActions:ArrayList保存下来。

3.       Settings把layoutId中的viewId指示的View的ImageSourceID设置到RemoteViews中[Seq#6~ #10]。

RemoteViews中有很多setXYZ()的方法,用来根据不同的要设置值的类型来设置;

setXYZ()创建ReflectionAction并把viewId和value,以及“setImageResource”作为methodName传入,ReflectionAction保存这些值;

ReflectionAction是RemoteViews.Action的子类,通过addAction()把ReflectionAction加入到mActions:ArrayList保存下来。

这里描述的是一个子过程,后续会通过AppWidgetManager把这个创建好的RemoteViews放进AppWidget系统中,从而使得AppWidget的AppWidgetHost端更新显示RemoteViews里承载的内容,

Remote端设置内容的过程,只是设置这些参数,而RemoteViews也只是用不同的RemoteViews.Action保存了这些参数。下文描述内部结构。

注意:这里的参数都是在Remote端的,在RemoteContext有效。

二、RemoteViews的内部结构

下图是RemoteViews相关的类图。

图二、RemoteViews类图

RemoteViews中保存Remote端的mPackage和mLayoutId;并用mActions:ArrayList保存各种Action。

mPackage和mLayoutId是在构造RemoteViews时传进去的[上文图中的seq#1];

mActions是设置各种Remote端的响应Intent以及图形元素的时候,保存到相应的Action中,然后把Action加入到这里保存的;

mLayoutId里的各种控件通过setTextViewText()/ setImageViewResource() / setProgressBar(),等函数在remote端设置的。这些方法再调用setType() [Type可为Boolean / Byte / Short / Int/ Long / Char / String / Uri / Bitmap/ Bundle, etc]保存到ReflectionAction中。

SetOnClickPendingIntent是用来在local端用户点击viewId时,发出pendingIntent通知的。在SetOnClickPendingIntent的构造方法中保存viewId和pendingIntent。

ReflectionAction用来在local端显示时,通过Reflect机制执行获得Remote端资源的。在ReflectionAction的构造方法中保存viewId,methodName,type以及value。

ViewGroupAction和SetDrawableParameters也是RemoteViews.Action的子类,在这个场景中并未用到,基本原理相似,读者可自行分析。

三、显示RemoteViews内容——AppWidgetHostView

图一中为RemoteViews提供了内容之后,AppWidgetHost会通过IAppWidgetHost.updateAppWidget()被通知到Remote端有更新,本地端把RemoteViews提供的内容显示在AppWidgetHostView上。下面的顺序图描述这一过程。

图三、本地显示RemoteViews里的内容

图中:

1.     获取RemoteViews里Remote端(AppWidgetProvider)的packageName和layoutId,通过packageName创建远端的context——remoteContext。[Seq#1~ 6]

2.     通过RemoteViews的apply()方法,真正开始执行侦听Click操作的动作;通过远端Layout获得本地使用的View。[Seq#7~ 20]

2.1. 克隆一个本地的LayoutInflater;[Seq#8]

2.2. 用克隆出的LayoutInflater对remote端的layoutId执行Inflate,获得Layout所描述的View的Hierarchy,亦即后面用到的rootView;[Seq#9~ 10]

2.3. 对2.2中获得的view执行performApply。[Seq#11~ 19]

performApply()对所有mActions中的Action都执行apply()操作。这样,

篇3:Android实现用户引导界面

首先看效果图,盗了超级课程表几张图

在众多应用中,几乎每一款应用都有自己的Splash用户引导界面,该界面在用户首次启动展示,之后不会显示,主要向用户展示新功能.

分析

主要使用ViewPager+Indicator实现 主要是实现一个圆形指示器,这个圆形指示器继承LinearLayout,需要有一些属性可以自定义,比如指示器的颜色,大小,边距等 这个指示器也可以自动滚动,比如应用在幻灯片展示的地方 指示器是圆形的,需要我们自己绘制 这个圆形指示器实现了ViewPager.OnPageChangeListener接口

实现

定义自定义属性

属性的意思见名字就可以知道了

定义自定义变量,从布局文件中解析进来,此外,如果布局文件没有使用,应该有一个默认的常量.

定义默认常量

private static final int DEFAULT_CIRCLE_SPACING = 5; private static final int DEFAULT_CIRCLE_COLOR=Color.WHITE; private static final int DEFAULT_CIRCLE_SIZE=3; private static final boolean DEFAULT_CIRCLE_AUTO_SCROLL=false; private static final int DEFAULT_CIRCLE_SCROLL_DELAY_TIME=3000; private static final boolean DEFAULT_CIRCLE_SCROLL_ANIMATION=true;

定义用于存储自定义属性的变量

private int mSpacing; private int mSize; private int mFillColor; private int mStrokeColor; private boolean mAutoScroll; private int mDelayTime; private boolean mIsAnimation;

定义其他辅助变量,比如Canvas,Bitmap,Paint等,用于绘制圆形指示器

private static final int CIRCLE_STROKE_WIDTH =1; private static final int BITMAP_PADDING =2; private ViewPager mViewPager; private int mCount; private int mLastIndex = 0; private Canvas mCanvas; private Paint mPaint; private Bitmap mSelectBitmap; private Bitmap mUnselectBitmap;

将自定义属性进行解析赋值给对应变量

private void initCustomParams(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleIndicator); try {mSpacing = typedArray.getDimensionPixelSize(R.styleable.CircleIndicator_circle_spacing, DEFAULT_CIRCLE_SPACING);mFillColor=typedArray.getColor(R.styleable.CircleIndicator_circle_fill_color,DEFAULT_CIRCLE_COLOR);mStrokeColor=typedArray.getColor(R.styleable.CircleIndicator_circle_stroke_color,DEFAULT_CIRCLE_COLOR);mSize= typedArray.getDimensionPixelSize(R.styleable.CircleIndicator_circle_radius, DEFAULT_CIRCLE_SIZE);mAutoScroll= typedArray.getBoolean(R.styleable.CircleIndicator_circle_auto_scroll, DEFAULT_CIRCLE_AUTO_SCROLL);mDelayTime=typedArray.getInt(R.styleable.CircleIndicator_circle_scroll_delay_time,DEFAULT_CIRCLE_SCROLL_DELAY_TIME);mIsAnimation=typedArray.getBoolean(R.styleable.CircleIndicator_circle_scroll_animation,DEFAULT_CIRCLE_SCROLL_ANIMATION); } finally {typedArray.recycle; } }

我们的指示器是自己绘制出来的,接下来绘制圆形指示器

private void init() { setOrientation(HORIZONTAL); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeWidth(dip2px(CIRCLE_STROKE_WIDTH)); mPaint.setColor(mFillColor); int size=dip2px(mSize+ BITMAP_PADDING + BITMAP_PADDING); int radius=dip2px(mSize / 2); int centerPoint=radius+ BITMAP_PADDING; mSelectBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); mUnselectBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(); mCanvas.setBitmap(mSelectBitmap); mCanvas.drawCircle(centerPoint, centerPoint, radius, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(mStrokeColor); mCanvas.setBitmap(mUnselectBitmap); mCanvas.drawCircle(centerPoint, centerPoint, radius, mPaint); }

实现构造方法,最终调用三个参数的构造方法,并调用相关函数进行初始化

public CircleIndicator(Context context) { this(context, null); } public CircleIndicator(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CircleIndicator(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initCustomParams(context, attrs); init(); }

实现指示器相关逻辑

首先需要初始化指示器的位置,应该是ViewPager的第一页,即初始化位置为0,调用initIndicator,并设置指示器的背景图为选中状态.记录上次指示器的位置即当前位置. removeIndicator移出指示器只要移出当前类的所有子View即可 updateIndicator需要将上次的位置背景图设置为未选中,当前位置设置未选中,并记录上次位置为当前位置 addIndicator需要将圆形指示器的数目传入,其值为ViewPager的页数,并新建ImageView设置背景图为未选中的时候的图,并设置外边距,将其添加到当前类的子View中,如果设置了自动滚动,还需要进行自动滚动 setViewPager函数进行一些初始化操作

public void setViewPager(ViewPager viewPager) { mViewPager = viewPager; mViewPager.addOnPageChangeListener(this); if (mViewPager != null) {mCount = mViewPager.getAdapter().getCount();addIndicator(mCount); } } private void addIndicator(int count) { removeIndicator(); if (count <= 0)return; for (int i = 0; i < count; i++) {ImageView imageView = new ImageView(getContext());LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);params.leftMargin = mSpacing/2;params.rightMargin = mSpacing/2;imageView.setImageBitmap(mUnselectBitmap);addView(imageView, params); } initIndicator(); if(mAutoScroll){sendScrollMessage(mDelayTime); } } private void initIndicator() { ((ImageView) getChildAt(0)).setImageBitmap(mSelectBitmap); mLastIndex=0; } private void removeIndicator() { removeAllViews(); } private void updateIndicator(int position) { if (position != mLastIndex) {((ImageView) getChildAt(mLastIndex)).setImageBitmap(mUnselectBitmap);((ImageView) getChildAt(position)).setImageBitmap(mSelectBitmap); } mLastIndex = position; }

实现自动滚动,主要通过Handler进行延时实现

private Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) { case SCROLL_WHAT: scrollOnce(); sendScrollMessage(mDelayTime); break;} } }; public void scrollOnce() { PagerAdapter adapter = mViewPager.getAdapter(); if (adapter == null) {return; } int nextIndex=mViewPager.getCurrentItem(); ++nextIndex; if(nextIndex >=mCount){nextIndex =0; } updateIndicator(nextIndex); mViewPager.setCurrentItem(nextIndex, mIsAnimation); } private void sendScrollMessage(long delayTimeInMills) { mHandler.removeMessages(SCROLL_WHAT); mHandler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills); }

实现相关getter和setter函数

private void setAutoScroll(boolean autoScroll){ if (autoScroll){sendScrollMessage(mDelayTime); }else{mHandler.removeMessages(SCROLL_WHAT); } mAutoScroll=autoScroll; } public boolean isAutoScroll() { return mAutoScroll; } public int getDelayTime() { return mDelayTime; } public void setDelayTime(int delayTime) { mDelayTime = delayTime; } public boolean isAnimation() { return mIsAnimation; } public void setIsAnimation(boolean isAnimation) { mIsAnimation = isAnimation; }

实现接口相关函数

@Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int position) { updateIndicator(position); } @Override public void onPageScrollStateChanged(int i) { }

以及一个单位转换的工具函数

private int dip2px(int dip) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, getResources().getDisplayMetrics()); }

使用

private void initView() { mViewPager= (ViewPager) findViewById(R.id.viewpager); mCircleIndicator= (CircleIndicator) findViewById(R.id.circle_indicator); mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {private int[] resId={R.mipmap.ic_help_view_1,R.mipmap.ic_help_view_2,R.mipmap.ic_help_view_3,R.mipmap.ic_help_view_4};private MapmFragments=new HashMap();@Overridepublic Fragment getItem(int i) { Fragment fragment=mFragments.get(i); if(fragment==null){ fragment=BlankFragment.newInstance(resId[i],i,resId.length); mFragments.put(i,fragment); } return fragment;}@Overridepublic int getCount() { return resId.length;} }); mCircleIndicator.setViewPager(mViewPager); }

package cn.edu.zafu.splash;import android.content.Intent;import android.os.Bundle;import android.support.v4.app.Fragment;import android.util.TypedValue;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.RelativeLayout;public class BlankFragment extends Fragment { private static final String IMAGE_ID = imageId; private static final String CUCRNT = curcent; private static final String TOTAL = total; private int mImageId; private int mCurcent; private int mTotal; public static BlankFragment newInstance(int imageId,int current,int total) { BlankFragment fragment = new BlankFragment(); Bundle args = new Bundle(); args.putInt(IMAGE_ID, imageId); args.putInt(CUCRNT, current); args.putInt(TOTAL, total); fragment.setArguments(args); return fragment; } public BlankFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) {mImageId = getArguments().getInt(IMAGE_ID);mCurcent = getArguments().getInt(CUCRNT);mTotal = getArguments().getInt(TOTAL); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view= inflater.inflate(R.layout.fragment_blank, container, false); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); super.onViewCreated(view, savedInstanceState); ImageView imageView= (ImageView) view.findViewById(R.id.image); imageView.setImageResource(mImageId); if(mCurcent==mTotal-1){RelativeLayout relativeLayout= (RelativeLayout) view.findViewById(R.id.relativelayout);ImageButton button=new ImageButton(getActivity().getApplicationContext());button.setBackgroundResource(R.drawable.last_button_selector);RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);params.addRule(RelativeLayout.CENTER_HORIZONTAL);params.bottomMargin=dip2px(80);relativeLayout.addView(button,params);button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int versionCode=Util.getAppVersionCode(getActivity()); Util.set(getActivity(),Util.FILE_NAME,versionCode+,true); Intent intent=new Intent(getActivity(),SecondActivity.class); startActivity(intent); getActivity().finish(); }}); } } private int dip2px(int dip) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, getActivity().getResources().getDisplayMetrics()); }}

如果要实现是否首次启动,如果是才显示的话需要加一些逻辑判断,如果当前版本号已经持久化了,则直接跳过,这个数据是在Splash页面最后一个按钮点击事件里处理的

private boolean ignoreSplash() { if(Util.contatins(this, Util.FILE_NAME, Util.getAppVersionCode(this) + )){Intent intent=new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);this.finish();return true; } return false; }

public void onClick(View v) { int versionCode=Util.getAppVersionCode(getActivity()); Util.set(getActivity(),Util.FILE_NAME,versionCode+,true); Intent intent=new Intent(getActivity(),SecondActivity.class); startActivity(intent); getActivity().finish(); }

篇4:Android实现心跳的效果

最近再做一个教育类的项目,在做一些学习工具的时候,美工提出了一些要求,大致如下:

其实实现过程也不难,大致就是对一个视图控件添加一个圆形的背景,然后该视图进行动画处理,膨胀的同时,透明度增大,收缩的同时,透明度降低。

我在例子中是使用了TextView,所以首先对TextView添加一个圆形的背景:

然后为TextView添加动画,包括调整大小的ScaleAnimation和调整透明度的AlphaAnimation。调整大小有两个部分,膨胀和收缩。在膨胀完毕后马上收缩,也就是对膨胀的动画进行监听,在onAnimationEnd()方法里面进行收缩,

// 按钮模拟心脏跳动 private void playHeartbeatAnimation(final View heartbeatView) { AnimationSet swellAnimationSet = new AnimationSet(true); swellAnimationSet.addAnimation(new ScaleAnimation(1.0f, 1.8f, 1.0f, 1.8f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f)); swellAnimationSet.addAnimation(new AlphaAnimation(1.0f, 0.3f)); swellAnimationSet.setDuration(500); swellAnimationSet.setInterpolator(new AccelerateInterpolator()); swellAnimationSet.setFillAfter(true); swellAnimationSet.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { AnimationSet shrinkAnimationSet = new AnimationSet(true); shrinkAnimationSet.addAnimation(new ScaleAnimation(1.8f, 1.0f, 1.8f, 1.0f, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF, 0.5f)); shrinkAnimationSet.addAnimation(new AlphaAnimation(0.3f, 1.0f)); shrinkAnimationSet.setDuration(1000); shrinkAnimationSet.setInterpolator(new DecelerateInterpolator()); shrinkAnimationSet.setFillAfter(false); heartbeatView.startAnimation(shrinkAnimationSet);// 动画结束时重新开始,实现心跳的View } }); heartbeatView.startAnimation(swellAnimationSet); }

心跳的效果是要不停地膨胀和收缩,所以要开一个线程来处理,每当收缩完毕后重新膨胀,

private class HeatbeatThread extends Thread { public void run() { try { sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } while (true) { runOnUiThread(new Runnable() { public void run() {for (View view : heartbeatViews) { playHeartbeatAnimation(view);} } }); try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } } }; }

最后和Activity的生命周期结合,对线程进行开始和结束。

private Thread heartbeatThread; /** * 开始心跳 */ private void startHeartBeat() { if (heartbeatThread == null) { heartbeatThread = new HeatbeatThread(); } if (!heartbeatThread.isAlive()) { heartbeatThread.start(); } } /** * 停止心跳 */ private void stopHeartBeat() { if (heartbeatThread != null && heartbeatThread.isInterrupted()) { heartbeatThread.interrupt(); heartbeatThread = null; System.gc(); } } @Override protected void onResume() { super.onResume(); startHeartBeat(); } @Override protected void onPause() { super.onPause(); stopHeartBeat(); }

篇5:ps图像处理简历

ps图像处理简历模板

ps图像处理简历模板,在阅读本文时大学生个人简历网(wWw.yJsjL.org)提供一篇图形图像专业个人简历模板作为参考!建议应届毕业生求职者在写求职简历时以求职意向与个人介绍为重点,请参照下面这份图像修辑师英文简历模板制作以写个人简历时为参考,为了确保求职者能写出一份更有专业水平的个人简历本网站推荐图形图象制作个人简历模板下载为写作技巧!

目前所在: 天河区 年 龄: 21

户口所在: 湛江 国 籍: 中国

婚姻状况: 未婚 民 族: 汉族

诚信徽章: 未申请  身 高: 150 cm

人才测评: 未测评  体 重: 40 kg

人才类型: 应届毕业生

应聘职位: 商务/电子商务-经理/主管/专员/助理, 文秘/文员

工作年限: 3 职 称: 初级

求职类型: 实习可到职日期: 随时

月薪要求: 1500-- 希望工作地区: 广州,,

工作经历

东莞利源电子有限公司 起止年月:-07 ~ 2011-08

公司性质: 私营企业 所属行业:电子技术/半导体/集成电路

担任职位: 普通员工

工作描述: 主要是做成品的加工,在工作期间,我可以了解学习每一条生产线的'那些管理员怎样合理地安排各个员工的岗位,还可以了解到每一条生产线的生产流程。

离职原因: 返校上课

广东省电子商务技师学院 起止年月:-09 ~ 2011-12

公司性质: 事业单位 所属行业:教育/培训/院校

担任职位: 学生会成员

工作描述: 加入学生会举检部,只要是每周定期检查学生的出勤人数,这让我养成了一个良好的日常行为习惯,并获得了“举检部优秀成员”的荣誉证书。

20 加入团委会常务部,只要是帮助老师整理一些资料文件,锻炼了我的工作能力。

毕业院校: 广东省电子商务技师学院 广东省国防工业职工大学

最高学历: 大专 获得学位:  毕业日期: -06

专 业 一: 电子商务 专 业 二:

起始年月 终止年月 学校(机构) 所学专业 获得证书 证书编号

2010-09 - 广东省电子商务技师学院 电子商务 计算机中级证 助理电子商务师 11124291

语言能力(QQ个性签名网 www.QQ0762.com/)

外语: 英语 一般 粤语水平: 良好

其它外语能力:

国语水平: 良好

工作能力及其他专长

本人主修课程:电子商务概论、经济学、网络营销、国际贸易实务、计算机应用技术电子商务物流与实务、电子商务网站建设与完整实例

熟悉的软件有:ps图像处理,Dreamweaver ,flash动画制作;熟悉office系列(Word、Excel、PowerPoint等)

个人自传

“爱拼才会赢”。学习能力强,能吃苦耐劳。

相关内容:信息系统技术个人简历模板,电子商务应届毕业生求职简历模板,园林设计个人简历模板

篇6:Android 图像异步加载之AndroidUniversalImageLoader

项目地址:github.com/nostra13/Android-Universal-Image-Loader UIL(Universal-Image-Loader)异步图像加载、缓存和显示.这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影, 同类类库(Picasso),尽管Picasso拥有更好的API,但其缺乏自定义。而使用UIL构建器几乎可以配置所有(其中最重要的就是在抓取和缓存大型图片时,Picasso会失败)。

特点: 多线程加载图像Multithread image loading (async or sync)宽泛的自定义配置Wide customization of ImageLoader's configuration (thread executors, downloader, decoder, memory and disk cache, display image options, etc.)Many customization options for every display image call (stub images, caching switch, decoding options, Bitmap processing and displaying, etc.)图像缓存Image caching in memory and/or on disk (device's file system or SD card)加载过程监听Listening loading process (including downloading progress) 简单描述一下这个项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在内存中,这种情况下图片会立即显示。如果需要的图片缓存在本地,他们会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。

由于源码中不管是loadImageSync还是loadImage最后都会通过displayImage来加载。那我们看看其流程:

篇7:Android 图像异步加载之AndroidUniversalImageLoader

安装:

maven:

com.nostra13.universalimageloaderuniversal-image-loader1.9.3

Gradle:

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'

添加网络和SD卡权限:

由于是使用过程中会图片获取要通过网络,并且有缓存设置,所以这2个权限必须要有。

预配置Application or Activity class (before the first usage of ImageLoader)

// Create global configuration and initialize ImageLoader with this config ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)....build; ImageLoader.getInstance().init(config);

篇8:Android 图像异步加载之AndroidUniversalImageLoader

site.com/image.png // from Webfile:///mnt/sdcard/image.png // from SD cardfile:///mnt/sdcard/video.mp4 // from SD card (video thumbnail)content://media/external/images/media/13 // from content providercontent://media/external/video/media/13 // from content provider (video thumbnail)assets://image.png // from assetsdrawable:// + R.drawable.img // from drawables (non-9patch images)

NOTE: Use drawable:// only if you really need it! Always consider the native way to load drawables - ImageView.setImageResource(...) instead of using of ImageLoader.

篇9:Android 图像异步加载之AndroidUniversalImageLoader

imageLoader.displayImage(imageUri, imageView);imageLoader.loadImage(imageUri, new SimpleImageLoadingListener { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { // Do whatever you want with Bitmap }});// Load image, decode it to Bitmap and return Bitmap synchronouslyBitmap bmp = imageLoader.loadImageSync(imageUri);// Load image, decode it to Bitmap and return Bitmap to callbackImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this sizeimageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { // Do whatever you want with Bitmap }});// Load image, decode it to Bitmap and return Bitmap synchronouslyImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this sizeBitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);

还可以通过ImageLoadingProgressListener监听进度。

篇10:Android 图像异步加载之AndroidUniversalImageLoader

ImageLoaderConfiguration应该是一个对于Application的全局对象,你应该只配置一次。

// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.// See the sample project how to use ImageLoader correctly.File cacheDir = StorageUtils.getCacheDirectory(context);ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 推荐 .diskCacheExtraOptions(480, 800, null) //.推荐diskCacheExtraOptions(480, 800, null) .taskExecutor(...) .taskExecutorForCachedImages(...) .threadPoolSize(3) // default 推荐1-5 .threadPriority(Thread.NORM_PRIORITY - 2) // default .tasksProcessingOrder(QueueProcessingType.FIFO) // default .denyCacheImageMultipleSizesInMemory() //设置内存缓存不允许缓存一张图片的多个尺寸,默认允许。 .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //使用强引用的缓存使用它,不过推荐使用weak与strong引用结合的UsingFreqLimitedMemoryCache或者使用全弱引用的WeakMemoryCache .memoryCacheSize(2 * 1024 * 1024) .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiscCache(cacheDir)) // default .diskCacheSize(50 * 1024 * 1024) .diskCacheFileCount(100) .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDownloader(new BaseImageDownloader(context)) // default .imageDecoder(new BaseImageDecoder()) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .writeDebugLogs() .build();

示例配置缓存目录

File cacheDir = StorageUtils.getOwnCacheDirectory(getApplicationContext(), imageloader/Cache);

.diskCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径

android学习方法

android个人简历

图像处理技术论文

android实现程序的后台运行

android程序员简历

Android程序员简历

Android中传感器Sensor的使用

android程序员试用期工作总结

Android Manifest 文件 详解

android实习总结报告模板

《Android图像处理技术(实现Android中的PS)(精选10篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档