Android 创建Library Project(库项目)与引用操作
2016-04-13 16:18
746 查看
关键部分:
作为library工程可以引用外部jar包,但不能引用其它library工程,在library工程中不能使用aidl文件,不能引用raw、assets下资源
资源同名的话,项目中的资源会覆盖库中的资源。
l 使用library之后properties 文件中会多了一个引用的定义。
l Android library可以重复使用java类,android组件和资源,但是assets的资源不会被重用。
l 若使用库中的activity之类的,需要在项目的AndroidManifest.xml中重新定义。
l 如果library中不用到这个类 android-support-v4.jar ,一定要把它删除 。
由于在开发过程,为了实现未曾了解的某种效果与特定功能,而求助于网上优秀的开源项目,在使用过程中发现引用开源的Library Project(库项目),的确可以解决很多问题,而且也给出了一种思路,好的软件公司也需要有自己的Library Project(库项目),这样不必要进行重复开发工作,这只是自己的想法。下面将自己的心得或体会记录如下,以下是自己的编写风格。
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/36405219】
Project(库项目)创建与引用操作。
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/36405219】
第二步:红色部分取消勾选,不勾选 [Create custom launcher icon] 和[Create activity], 勾选[Make this project as a library]。
第三步:先建包名,添加MyImageView.java 文件。 【MyImageView.java引用他人的代码,在此表示感谢。】
[java] view
plain copy
print?
package com.example.lib;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
public class MyImageView extends ImageView {
private static final String TAG = "MyImageView";
private static final int SCALE_REDUCE_INIT = 0;
private static final int SCALING = 1;
private static final int SCALE_ADD_INIT = 6;
/** * 控件的宽*/
private int mWidth;
/*** 控件的高*/
private int mHeight;
/*** 控件的宽1/2*/
private int mCenterWidth;
/*** 控件的高 1/2*/
private int mCenterHeight;
/*** 设置一个缩放的常量*/
private float mMinScale = 0.85f;
/*** 缩放是否结束*/
private boolean isFinish = true;
public MyImageView(Context context) {
this(context, null);
}
public MyImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* 必要的初始化
*/
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed) {
mWidth = getWidth() - getPaddingLeft() - getPaddingRight();
mHeight = getHeight() - getPaddingTop() - getPaddingBottom();
mCenterWidth = mWidth / 2;
mCenterHeight = mHeight / 2;
Drawable drawable = getDrawable();
BitmapDrawable bd = (BitmapDrawable) drawable;
bd.setAntiAlias(true);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float X = event.getX();
float Y = event.getY();
mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT);
break;
case MotionEvent.ACTION_UP:
mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT);
break;
}
return true;
}
/**
* 控制缩放的Handler
*/
private Handler mScaleHandler = new Handler() {
private Matrix matrix = new Matrix();
private int count = 0;
private float s;
/**
* 是否已经调用了点击事件
*/
private boolean isClicked;
public void handleMessage(android.os.Message msg) {
matrix.set(getImageMatrix());
switch (msg.what) {
case SCALE_REDUCE_INIT:
if (!isFinish) {
mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT);
} else {
isFinish = false;
count = 0;
s = (float) Math.sqrt(Math.sqrt(mMinScale));
beginScale(matrix, s);
mScaleHandler.sendEmptyMessage(SCALING);
}
break;
case SCALING:
beginScale(matrix, s);
if (count < 4) {
mScaleHandler.sendEmptyMessage(SCALING);
} else {
isFinish = true;
if (MyImageView.this.mOnViewClickListener != null
&& !isClicked) {
isClicked = true;
MyImageView.this.mOnViewClickListener
.onViewClick(MyImageView.this);
} else {
isClicked = false;
}
}
count++;
break;
case SCALE_ADD_INIT:
if (!isFinish) {
mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT);
} else {
isFinish = false;
count = 0;
s = (float) Math.sqrt(Math.sqrt(1.0f / mMinScale));
beginScale(matrix, s);
mScaleHandler.sendEmptyMessage(SCALING);
}
break;
}
}
};
protected void sleep(int i) {
try {
Thread.sleep(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 缩放
*
* @param matrix
* @param scale
*/
private synchronized void beginScale(Matrix matrix, float scale) {
matrix.postScale(scale, scale, mCenterWidth, mCenterHeight);
setImageMatrix(matrix);
}
/**
* 回调接口
*/
private OnViewClickListener mOnViewClickListener;
public void setOnClickIntent(OnViewClickListener onViewClickListener) {
this.mOnViewClickListener = onViewClickListener;
}
public interface OnViewClickListener {
void onViewClick(MyImageView view);
}
}
第四步:创建另一个项目MyProj ,勾选 [Create custom launcher icon] 和[Create activity], 不勾选[Make this project as a library]。
第五步:引用MyLib项目。
第六步:编写activtiy_main.xml与对应的Activity。
【activtiy_main.xml】
[html] view
plain copy
print?
<RelativeLayout xmlns: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:gravity="center"
tools:context=".MainActivity" >
<com.example.lib.MyImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:scaleType="matrix"
android:src="@drawable/chat_004"
android:id="@+id/myImageView"/>
</RelativeLayout>
【MainActivtiy.java】
[java] view
plain copy
print?
package com.example.myproj;
import com.example.lib.MyImageView;
import com.example.lib.MyImageView.OnViewClickListener;
import android.os.Bundle;
import android.app.Activity;
import android.widget.Toast;
public class MainActivity extends Activity {
private MyImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
imageView = (MyImageView) findViewById(R.id.myImageView);
imageView.setOnClickIntent(new OnViewClickListener() {
@Override
public void onViewClick(MyImageView view) {
Toast.makeText(getApplicationContext(), "你点触了这个可爱的表情!", Toast.LENGTH_SHORT).show();
}
});
}
}
第七步:运行项目MyProj,出现如下效果。
作为library工程可以引用外部jar包,但不能引用其它library工程,在library工程中不能使用aidl文件,不能引用raw、assets下资源
资源同名的话,项目中的资源会覆盖库中的资源。
l 使用library之后properties 文件中会多了一个引用的定义。
l Android library可以重复使用java类,android组件和资源,但是assets的资源不会被重用。
l 若使用库中的activity之类的,需要在项目的AndroidManifest.xml中重新定义。
l 如果library中不用到这个类 android-support-v4.jar ,一定要把它删除 。
由于在开发过程,为了实现未曾了解的某种效果与特定功能,而求助于网上优秀的开源项目,在使用过程中发现引用开源的Library Project(库项目),的确可以解决很多问题,而且也给出了一种思路,好的软件公司也需要有自己的Library Project(库项目),这样不必要进行重复开发工作,这只是自己的想法。下面将自己的心得或体会记录如下,以下是自己的编写风格。
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/36405219】
应用场景:
在项目的开发过程中,经常会使用公司内部的公共库或使用优秀的开源项目库,以求达到快速开发、代码复用的效果。所开发的项目中要集成其他项目由于集成项目庞大,不想机械的复制,就想将集成的项目做成项目库。基于这样的需求,引用Library Project(库项目),成为了迫切的需要,这样做以后集成项目升级、扩展也都方便与快捷。为此,我们不得不去了解Android LibraryProject(库项目)创建与引用操作。
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/36405219】
使用方式:
第一步:创建项目MyLib,【Next】。第二步:红色部分取消勾选,不勾选 [Create custom launcher icon] 和[Create activity], 勾选[Make this project as a library]。
第三步:先建包名,添加MyImageView.java 文件。 【MyImageView.java引用他人的代码,在此表示感谢。】
[java] view
plain copy
print?
package com.example.lib;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
public class MyImageView extends ImageView {
private static final String TAG = "MyImageView";
private static final int SCALE_REDUCE_INIT = 0;
private static final int SCALING = 1;
private static final int SCALE_ADD_INIT = 6;
/** * 控件的宽*/
private int mWidth;
/*** 控件的高*/
private int mHeight;
/*** 控件的宽1/2*/
private int mCenterWidth;
/*** 控件的高 1/2*/
private int mCenterHeight;
/*** 设置一个缩放的常量*/
private float mMinScale = 0.85f;
/*** 缩放是否结束*/
private boolean isFinish = true;
public MyImageView(Context context) {
this(context, null);
}
public MyImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* 必要的初始化
*/
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed) {
mWidth = getWidth() - getPaddingLeft() - getPaddingRight();
mHeight = getHeight() - getPaddingTop() - getPaddingBottom();
mCenterWidth = mWidth / 2;
mCenterHeight = mHeight / 2;
Drawable drawable = getDrawable();
BitmapDrawable bd = (BitmapDrawable) drawable;
bd.setAntiAlias(true);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float X = event.getX();
float Y = event.getY();
mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT);
break;
case MotionEvent.ACTION_UP:
mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT);
break;
}
return true;
}
/**
* 控制缩放的Handler
*/
private Handler mScaleHandler = new Handler() {
private Matrix matrix = new Matrix();
private int count = 0;
private float s;
/**
* 是否已经调用了点击事件
*/
private boolean isClicked;
public void handleMessage(android.os.Message msg) {
matrix.set(getImageMatrix());
switch (msg.what) {
case SCALE_REDUCE_INIT:
if (!isFinish) {
mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT);
} else {
isFinish = false;
count = 0;
s = (float) Math.sqrt(Math.sqrt(mMinScale));
beginScale(matrix, s);
mScaleHandler.sendEmptyMessage(SCALING);
}
break;
case SCALING:
beginScale(matrix, s);
if (count < 4) {
mScaleHandler.sendEmptyMessage(SCALING);
} else {
isFinish = true;
if (MyImageView.this.mOnViewClickListener != null
&& !isClicked) {
isClicked = true;
MyImageView.this.mOnViewClickListener
.onViewClick(MyImageView.this);
} else {
isClicked = false;
}
}
count++;
break;
case SCALE_ADD_INIT:
if (!isFinish) {
mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT);
} else {
isFinish = false;
count = 0;
s = (float) Math.sqrt(Math.sqrt(1.0f / mMinScale));
beginScale(matrix, s);
mScaleHandler.sendEmptyMessage(SCALING);
}
break;
}
}
};
protected void sleep(int i) {
try {
Thread.sleep(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 缩放
*
* @param matrix
* @param scale
*/
private synchronized void beginScale(Matrix matrix, float scale) {
matrix.postScale(scale, scale, mCenterWidth, mCenterHeight);
setImageMatrix(matrix);
}
/**
* 回调接口
*/
private OnViewClickListener mOnViewClickListener;
public void setOnClickIntent(OnViewClickListener onViewClickListener) {
this.mOnViewClickListener = onViewClickListener;
}
public interface OnViewClickListener {
void onViewClick(MyImageView view);
}
}
第四步:创建另一个项目MyProj ,勾选 [Create custom launcher icon] 和[Create activity], 不勾选[Make this project as a library]。
第五步:引用MyLib项目。
第六步:编写activtiy_main.xml与对应的Activity。
【activtiy_main.xml】
[html] view
plain copy
print?
<RelativeLayout xmlns: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:gravity="center"
tools:context=".MainActivity" >
<com.example.lib.MyImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:scaleType="matrix"
android:src="@drawable/chat_004"
android:id="@+id/myImageView"/>
</RelativeLayout>
【MainActivtiy.java】
[java] view
plain copy
print?
package com.example.myproj;
import com.example.lib.MyImageView;
import com.example.lib.MyImageView.OnViewClickListener;
import android.os.Bundle;
import android.app.Activity;
import android.widget.Toast;
public class MainActivity extends Activity {
private MyImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
imageView = (MyImageView) findViewById(R.id.myImageView);
imageView.setOnClickIntent(new OnViewClickListener() {
@Override
public void onViewClick(MyImageView view) {
Toast.makeText(getApplicationContext(), "你点触了这个可爱的表情!", Toast.LENGTH_SHORT).show();
}
});
}
}
第七步:运行项目MyProj,出现如下效果。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析