是否可以更改 Android Gallery 的默认排列? 我的意思是我们可以在弯曲的路径中制作图库吗,图像将沿着弯曲的路径,同时它具有 Android 图库的所有属性?
如果可能,请告诉我您的想法。欢迎所有想法。
感谢和问候, 森
最佳答案
扩展图库并覆盖 drawChild。
drawChild 将为每个需要绘制的 child 调用。
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
final int left = child.getLeft();
int adjustedXOrigin = left - (getWidth() / 2) + (child.getWidth()/2);
int newtop = (int) (ellipseYOffset - Math.sqrt( ellipseMinor2 * (1 - ((Math.pow(adjustedXOrigin, 2)) / ellipseMajor2))));
newtop -= (child.getHeight() / 2);
if( newtop >= 0 )
{
child.layout(left, newtop, left + child.getWidth(), newtop + child.getHeight());
return super.drawChild(canvas, child, drawingTime);
}
return true;
}
在 onLayout 中,我计算 ellipseYOffset。无论椭圆大小如何,这都会在 View 中垂直居中选中的中间 View 。
ellipseYOffset = getMeasuredHeight() + (ellipseMinor - (getMeasuredHeight() / 2));
“if (newtop >= 0 )”部分是因为 View 随机绘制在奇怪的地方。这阻止了那个。
编辑:完整代码
有些动画你不需要,我只是复制并粘贴了我的类(class)。
public class Carousel extends Gallery {
private static final float INITIAL_MINOR_RATIO = 0.75f;
private static final float INITIAL_MAJOR_RATIO = 1.0f;
private int mEllipseMajor;
private int mEllipseMinor;
private int mEllipseMajor2;
private int mEllipseMinor2;
private int mEllipseYOffset;
private Animation mGalleryAlphaOut;
private Animation mGalleryAlphaIn;
private OnAnimationEndListener mFadeInEndListener;
private OnAnimationEndListener mFadeOutEndListener;
private boolean mCustomEllipseDim = false;
private boolean mInfinite = true;
private int mXOff = 0;
private AnimationListener mFadeInAnimationListener = new AnimationListener() {
public void onAnimationStart(Animation animation) {}
public void onAnimationRepeat(Animation animation) {}
public void onAnimationEnd(Animation animation) {
if( mFadeInEndListener != null )
{
mFadeInEndListener.onAnimationEnd();
}
}
};
private AnimationListener mFadeOutAnimationListener = new AnimationListener() {
public void onAnimationStart(Animation animation) {}
public void onAnimationRepeat(Animation animation) {}
public void onAnimationEnd(Animation animation) {
if( mFadeOutEndListener != null )
{
mFadeOutEndListener.onAnimationEnd();
}
}
};
public Carousel(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public Carousel(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public Carousel(Context context) {
super(context);
init();
}
private void init()
{
setHorizontalFadingEdgeEnabled(false);
setCallbackDuringFling(true);
setUnselectedAlpha(1.0f);
setHapticFeedbackEnabled(false);
int dur = getResources().getInteger(R.integer.transition_dur);
mGalleryAlphaOut = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_out);
mGalleryAlphaOut.setFillAfter(true);
mGalleryAlphaOut.setDuration(dur);
mGalleryAlphaOut.setAnimationListener(mFadeOutAnimationListener);
mGalleryAlphaIn = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in);
mGalleryAlphaIn.setFillAfter(true);
mGalleryAlphaIn.setDuration(dur);
mGalleryAlphaIn.setAnimationListener(mFadeInAnimationListener);
}
public int getEllipseMajor() {
return mEllipseMajor;
}
public void setEllipseMajor(int ellipseMajor) {
if( ellipseMajor == 0 )
{
mCustomEllipseDim = false;
}
this.mEllipseMajor = ellipseMajor;
}
public int getEllipseMinor() {
return mEllipseMinor;
}
public void setEllipseMinor(int ellipseMinor) {
if( ellipseMinor == 0 )
{
mCustomEllipseDim = false;
}
this.mEllipseMinor = ellipseMinor;
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
final int left = child.getLeft();
final int childWidth = child.getWidth();
final int childHeight = child.getHeight();
int adjustedXOrigin = left - mXOff + (childWidth>>1);
int newtop = (int) (mEllipseYOffset - Math.sqrt( mEllipseMinor2 * (1 - ((Math.pow(adjustedXOrigin, 2)) / mEllipseMajor2))));
newtop -= (childHeight>>1);
if( newtop >= 0 )
{
child.layout(left, newtop, left + childWidth, newtop + childHeight);
return super.drawChild(canvas, child, drawingTime);
}
return true;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if( !mCustomEllipseDim )
{
mEllipseMajor = (int) (getMeasuredWidth() * INITIAL_MAJOR_RATIO + 0.5f);
mEllipseMinor = (int) (getMeasuredHeight() * INITIAL_MINOR_RATIO + 0.5f);
mEllipseMajor2 = (int) Math.pow( mEllipseMajor, 2 );
mEllipseMinor2 = (int) Math.pow( mEllipseMinor, 2 );
}
mEllipseYOffset = getMeasuredHeight() + (mEllipseMinor - (getMeasuredHeight() / 2));
mXOff = (getWidth() / 2);
}
@Override
public void setAdapter(SpinnerAdapter adapter) {
super.setAdapter(adapter);
if( mInfinite )
{
resetPosition();
}
}
public void resetPosition()
{
int pos = Integer.MAX_VALUE / 2;
if( getAdapter() != null && getAdapter().getClass() == CarouselAdapter.class )
{
int size = ((CarouselAdapter)getAdapter()).getList().size();
if( size > 2 )
pos = pos - (pos % ((CarouselAdapter)getAdapter()).getList().size());
else
pos = 0;
setSelection(pos);
}
}
public OnAnimationEndListener getFadeInEndListener() {
return mFadeInEndListener;
}
public void setFadeInEndListener(OnAnimationEndListener fadeInEndListener) {
this.mFadeInEndListener = fadeInEndListener;
}
public OnAnimationEndListener getFadeOutEndListener() {
return mFadeOutEndListener;
}
public void setFadeOutEndListener(OnAnimationEndListener fadeOutEndListener) {
this.mFadeOutEndListener = fadeOutEndListener;
}
public void fadeIn()
{
startAnimation(mGalleryAlphaIn);
}
public void fadeOut()
{
startAnimation(mGalleryAlphaOut);
}
public interface OnAnimationEndListener
{
public abstract void onAnimationEnd();
}
//This disables the effect of a vehicle becoming focused when it is clicked.
@Override
public boolean onSingleTapUp(MotionEvent e) {
if( getAdapter() != null )
{
if( pointToPosition((int)e.getX(), (int)e.getY()) != getSelectedItemPosition() )
return true;
else
return super.onSingleTapUp(e);
}
else
return true;
}
}
关于android - 弯曲画廊的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3732739/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我遇到了ruby正则表达式的问题。我需要找到所有(可能重叠的)匹配项。这是问题的简化:#Simpleexample"Hey".scan(/../)=>["He"]#Actualresults#Withoverlappingmatchestheresultshouldbe=>["He"],["ey"]我尝试执行并获得所有结果的正则表达式如下所示:"aaaaaa".scan(/^(..+)\1+$/)#Thislooksformultiplesof(here)"a"biggerthanonethat"fills"theentirestring."aa"*3=>true,"aaa"*2=
在我们的项目中,我们有一些“被遗忘的”类存在了很长一段时间。那些类已被其他类替代,但我们忘记删除它们。是否有一些自动化的方法/工具可以发现Ruby{onRails}应用程序中没有使用哪些类?谢谢! 最佳答案 这个问题已经被提出了很多次,但是最好的答案都在这里:FindunusedcodeinaRailsapp我个人喜欢日志解析:https://stackoverflow.com/a/14161807但在任何情况下,您都可以创建自己的记录器,扩展ActiveRecord::Base以创建一个观察器,该观察器将最常用的模块存储在数据库中
我正在研究Ruby解释器是如何实现的,并且出现了一个问题,但我还没有得到答案。这就是标题中的那个:因为Class(r_cClass)将super设置为自身(忽略元类,因为实际上super是r_cClass的元类),如果我向Class对象发送一个方法,这将在Class的方法表中查找'类(class)。但是Class的类是Class,所以我不应该最终寻找Class的实例方法吗?但事实并非如此,因为在文档中Class类方法和Class实例方法是分开的。在Ruby的eval.c中的search_method中,我没有发现对Class类有什么特别的检查。任何人都可以阐明这一点吗?
我知道我能做到:classParentdefinitialize(args)args.eachdo|k,v|instance_variable_set("@#{k}",v)endendendclassA但我想使用关键字参数来更清楚地说明可以接受哪个散列键方法(并进行验证表明不支持此键)。所以我可以写:classAdefinitialize(param1:3,param2:4)@param1=param1@param2=param2endend但是有没有可能写一些更短的东西而不是@x=x;@y=y;...从传递的关键字参数初始化实例变量?是否可以访问作为哈希传递的关键字参数?
我有一个模块,其中包含名为String的类(以及其他类。)我需要按名称查找该类,如果没有这样的类,则优雅地回退。moduleMod1moduleStringendendMod1.const_get'String'#⇒Mod1::StringKernel.const_get'::Mod1::String'#⇒Mod1::String到目前为止,还不错。当我尝试查找不存在的类时,我预计会收到NameError,这很好。问题是如果在全局命名空间中存在一个具有给定名称的类,它将被返回:Mod1.const_get'Fixnum'#⇒Fixnum我明白其中的原因,但我的问题是:是否有现成的方法仅
我在做:can:manage,:allifuser.role=='admin'can:approve,Anunciodo|anuncio|anuncio.try(:aprovado)==falseend我的第二种方法不起作用,因为:manage:all覆盖了它。有一种方法可以声明可以管理除批准之外的所有内容吗?在里面批准我只是做can:approve,Anunciodo|anuncio|user.role=='admin'&&anuncio.try(:aprovado)==falseend什么是更好的解决方案? 最佳答案 尝试换一种
试图想出一种更紧凑的方式来在HAML和Ruby中表达这个条件,也许使用三元运算符:-if@page.nil?%br(nothingyet)-else%br#{@page.name}(根据NeatwaytoconditionallytestwhethertoaddaclassinHAMLtemplate寻找类似的方法)您的帮助将不胜感激:) 最佳答案 您的代码使文本成为的子元素元素;这是不可取的。我认为,您真正的意思是:%br-if@page.nil?(nothingyet)-else#{@page.name}为此你可以简单地做:%b
我有一个长度为一个字符的字符串,可以是任何可能的字符值:irb(main):001:0>"\x0"=>"\u0000"我认为这可能有效:irb(main):002:0>"\x0"+=1SyntaxError:(irb):2:syntaxerror,unexpectedtOP_ASGN,expecting$end"\x0"+=1^from/opt/rh/ruby193/root/usr/bin/irb:12:in`'但是,如您所见,事实并非如此。我怎样才能增加/减少我的角色?编辑:Ruby似乎没有被设置为执行此操作。也许我正在以错误的方式接近这个。我想根据8位block来操作原始数据。我